Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,070Paid calls: 1,524Letters: 13Defects: 1,322counted 2 min ago
teppi

Server definition

Hash
sha256:0f0549c73327ec8efc2c680ef71127f281e661f7fe8d36b3fe23f07b5ecf2a20
What it is
What a remote MCP server returned when asked what it offers: 9 tools

The blob, as servednamed by its sha256

{ "instructions": "# Clinic administration with DodoDentist\n\nThis skill drives the hosted DodoDentist MCP connector. The user must connect\nDodoDentist and authorize an account that can access the intended\norganization. If authorization fails, ask the user to connect or reauthorize;\ndo not guess identifiers or retry with another tenant.\n\n## Hard privacy and clinical boundary\n\nThis connector is administrative-only. It intentionally does not expose:\n\n- patient identities, records, contact details or record counts;\n- individual appointment records, identifiers, statuses, procedures or times;\n- diagnoses, treatment plans, procedure instances, prescriptions, medical\n history, anamnesis, tooth charts, images or notes;\n- provider identifiers/contact details, credentials or organization internals;\n or\n- tools that create, update, message, cancel or delete records.\n\nNever ask the user to paste excluded health data into chat, infer it from\naggregate counts, or imply that a missing tool can be approximated from\nanother result. The connector does not diagnose, triage, prescribe, recommend\ntreatment, determine urgency or make any medical decision.\n\nBookable availability is unassigned clinic capacity inside the practice's own\nonline-booking window. A procedure catalog is administrative configuration.\nNeither is evidence that a particular person has an appointment or receives a\ntreatment.\n\n## Available tools\n\n| Tool | Use it when someone asks… |\n| ----------------------------- | ----------------------------------------------------------------------------- |\n| `list_clinics` | which practices they run; also resolves the clinic ID every other tool needs |\n| `get_clinic` | about one practice's currency, language or timezone |\n| `get_clinic_availability` | when there are free appointment times (up to 7 days with openings, 100 slots) |\n| `list_clinic_providers` | which dentists, nurses or assistants can be booked (up to 100 display names) |\n| `get_clinic_schedule_summary` | how busy each UTC day is (appointment counts, at most 31 days) |\n| `list_procedures` | what a treatment costs (catalog names and prices) |\n| `list_calendar_events` | when the practice is closed or a dentist or chair is blocked |\n| `show_clinic_overview` | for a one-card overview of one practice |\n\nEvery tool is read-only. There is no connector operation for booking,\nrescheduling, cancellation, messaging, patient lookup, clinical-record access,\ndiagnosis or treatment.\n\n## Identifiers and pagination\n\nNever guess a clinic ID. Start with `list_clinics`, choose the clinic that\nmatches the user's request, and reuse its returned 24-character hexadecimal\nID. If several clinics match, ask which one they mean.\n\n`list_procedures` and `list_calendar_events` return opaque cursors. Reuse a\ncursor only with the same clinic, time range and limit that produced it. Start\na new listing when a filter changes. Do not interpret or edit a cursor.\n\nProvider and procedure identifiers are intentionally absent. Do not claim that\na display name or catalog name uniquely identifies an internal record.\n\n## Administrative overview workflow\n\nWhen the user wants a broad clinic snapshot:\n\n1. Call `list_clinics`.\n2. Resolve the intended clinic without guessing.\n3. Call `show_clinic_overview` with that clinic ID.\n4. Interpret only the safe metadata, aggregate next-seven-day schedule,\n provider/availability counts and procedure-catalog preview rendered by the\n card.\n\nCounts with `+` are lower bounds from bounded reads. Do not describe them as\ncomplete totals.\n\n## Schedule and capacity workflow\n\nFor workload over a period:\n\n1. Resolve the clinic with `list_clinics`.\n2. Call `get_clinic_schedule_summary` with ISO 8601 start/end values. Omit\n both for the default seven-day range. Never request more than 31 days.\n3. Report only the aggregate total and UTC day counts. Counts include canceled\n appointments; say so when describing workload.\n4. Use `get_clinic_availability` separately when the user wants open capacity.\n\nThe schedule summary deliberately omits individual times and records. Do not\ntry to reconstruct them. Availability can show exact open slot start/end times\nbecause those slots are unassigned.\n\n## Providers and procedure catalog\n\nUse `list_clinic_providers` for bookable provider display names. It provides no\nIDs, contact details or role records.\n\nUse `list_procedures` for administrative catalog names/prices. Follow\n`nextCursor` only when the user needs more results. Never describe catalog\nentries as a person's diagnosis, treatment history or recommended care.\n\n## Calendar blocks\n\nUse `list_calendar_events` for closures, meetings, courses, days off and other\nnon-appointment blocks. It exposes only block times, all-day status, scope,\neffect and type. Titles, notes, event IDs and staff references are\nintentionally unavailable.\n\nDo not infer a reason or person from a block. If the user needs the hidden\nfree-text details, explain that the connector does not provide them.\n\n## Unsupported requests\n\nFor a patient/clinical request, state that the public connector cannot access\nthat data. For a write request, state that all available tools are read-only.\nFor diagnosis, urgency, medication or treatment advice, do not invoke\nDodoDentist as a clinical authority; follow the host's current safety guidance\nand make clear that the connector provides no medical decision.\n\n## Clinic sidebar\n\n`open_dododentist` opens the clinic library without arguments. Select an owned\nclinic to load `show_clinic_overview`, then inspect aggregate schedule counts,\navailability counts or catalog prices. The selected clinic and view are shared\nwith the assistant. This does not broaden the administrative-only boundary.\n", "tools": [ { "description": "Use this when someone asks about one dental practice's setup, such as its currency, language or timezone. Returns the practice's name, currency, default language, timezone and last edit time. Not for free appointment times.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "clinicId": { "description": "Practice id: 24 lowercase hexadecimal characters", "pattern": "^[0-9a-f]{24}$", "type": "string" } }, "required": [ "clinicId" ], "type": "object" }, "name": "get_clinic", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "clinic": { "anyOf": [ { "additionalProperties": false, "properties": { "currency": { "anyOf": [ { "pattern": "^[A-Za-z]{3}$", "type": "string" }, { "type": "null" } ] }, "defaultLocale": { "anyOf": [ { "pattern": "^[a-zA-Z]{2,3}([_-][a-zA-Z0-9]{2,8}){0,2}$", "type": "string" }, { "type": "null" } ] }, "id": { "anyOf": [ { "pattern": "^[0-9a-f]{24}$", "type": "string" }, { "type": "null" } ] }, "lastEditTime": { "anyOf": [ { "maxLength": 32, "type": "string" }, { "type": "null" } ] }, "name": { "maxLength": 200, "type": "string" }, "timezone": { "anyOf": [ { "maxLength": 64, "type": "string" }, { "type": "null" } ] } }, "required": [ "id", "name", "currency", "defaultLocale", "timezone", "lastEditTime" ], "type": "object" }, { "type": "null" } ], "description": "Administrative practice metadata only; opening hours, staff, patient and appointment data are not included. Null when not found." }, "status": { "enum": [ "found", "not-found" ], "type": "string" } }, "required": [ "status", "clinic" ], "type": "object" } }, { "description": "Use this when someone asks when their dental practice has free appointment times or the next available slot. Returns each open online-booking slot's start and end, grouped by day, for the next days with openings: up to 7 days and 100 slots (no patient or dentist details). Not for booking or holding a slot.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "clinicId": { "description": "Practice id: 24 lowercase hexadecimal characters", "pattern": "^[0-9a-f]{24}$", "type": "string" } }, "required": [ "clinicId" ], "type": "object" }, "name": "get_clinic_availability", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "days": { "description": "One row per day with open online-booking slots, in date order, holding at most 100 slots in total. Slot times only; patients, dentists, treatments and clinical data are never included.", "items": { "additionalProperties": false, "properties": { "day": { "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "type": "string" }, "slots": { "items": { "additionalProperties": false, "properties": { "endTime": { "maxLength": 32, "type": "string" }, "startTime": { "maxLength": 32, "type": "string" } }, "required": [ "startTime", "endTime" ], "type": "object" }, "maxItems": 100, "type": "array" } }, "required": [ "day", "slots" ], "type": "object" }, "maxItems": 7, "type": "array" } }, "required": [ "days" ], "type": "object" } }, { "description": "Use this when someone asks how busy their dental practice is or how many appointments are booked each day. Returns appointment counts per UTC day for one practice, whatever their status, for the next 7 days by default and at most 31 days; counting stops at 100. Not for counting cancellations or seeing who is booked.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "clinicId": { "description": "Practice id: 24 lowercase hexadecimal characters", "pattern": "^[0-9a-f]{24}$", "type": "string" }, "endTime": { "$ref": "#/properties/startTime", "description": "End of the range as an ISO 8601 date-time, after startTime and at most 31 days later; defaults to 7 days after the start" }, "startTime": { "description": "Start of the range as an ISO 8601 date-time; defaults to now", "maxLength": 32, "type": "string" } }, "required": [ "clinicId" ], "type": "object" }, "name": "get_clinic_schedule_summary", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "appointmentCount": { "maximum": 100, "minimum": 0, "type": "integer" }, "appointmentCountIsLowerBound": { "description": "True when more than 100 appointments fall in the range", "type": "boolean" }, "days": { "description": "One row per UTC day that has appointments, canceled ones included, counting only appointments the signed-in account can view. Aggregate counts only: appointment identifiers and times, patient information, procedures, diagnoses and notes are never returned.", "items": { "additionalProperties": false, "properties": { "appointmentCount": { "maximum": 100, "minimum": 0, "type": "integer" }, "day": { "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "type": "string" } }, "required": [ "day", "appointmentCount" ], "type": "object" }, "maxItems": 100, "type": "array" }, "range": { "additionalProperties": false, "properties": { "endTime": { "$ref": "#/properties/range/properties/startTime" }, "startTime": { "maxLength": 32, "type": "string" } }, "required": [ "startTime", "endTime" ], "type": "object" } }, "required": [ "range", "appointmentCount", "appointmentCountIsLowerBound", "days" ], "type": "object" } }, { "description": "Use this when someone asks when their dental practice is closed, or when a dentist or chair is blocked for holidays, courses, meetings or maintenance. Returns each block or extra opening with start, end, all-day flag, scope and type (no titles or notes). Not for patient appointments.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "clinicId": { "description": "Only this practice (24 lowercase hexadecimal characters); every practice when absent", "pattern": "^[0-9a-f]{24}$", "type": "string" }, "cursor": { "description": "The nextCursor of the previous page with the same filters; absent for the first page", "maxLength": 4096, "type": "string" }, "endTime": { "$ref": "#/properties/startTime", "description": "Only blocks ending before this ISO 8601 date-time" }, "limit": { "description": "Blocks per page, from 1 to 100; defaults to 20", "exclusiveMinimum": 0, "maximum": 100, "type": "integer" }, "startTime": { "description": "Only blocks starting at or after this ISO 8601 date-time", "maxLength": 32, "type": "string" } }, "type": "object" }, "name": "list_calendar_events", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "calendarEvents": { "description": "Non-appointment calendar blocks, earliest first. Event identifiers, staff and chair references, titles, notes and patient links are never returned.", "items": { "additionalProperties": false, "properties": { "allDay": { "type": "boolean" }, "effect": { "anyOf": [ { "enum": [ "BLOCK", "OPEN" ], "type": "string" }, { "type": "null" } ], "description": "BLOCK removes bookable time; OPEN adds hours on a normally closed time" }, "endTime": { "anyOf": [ { "$ref": "#/properties/calendarEvents/items/properties/startTime/anyOf/0" }, { "type": "null" } ] }, "scope": { "anyOf": [ { "enum": [ "SEAT", "PROVIDER", "CLINIC" ], "type": "string" }, { "type": "null" } ], "description": "CLINIC: the whole practice; PROVIDER: one or more staff; SEAT: one chair" }, "startTime": { "anyOf": [ { "maxLength": 32, "type": "string" }, { "type": "null" } ] }, "type": { "anyOf": [ { "enum": [ "COURSE", "MEETING", "VACATION", "SICK", "HOLIDAY", "MAINTENANCE", "OTHER" ], "type": "string" }, { "type": "null" } ] } }, "required": [ "startTime", "endTime", "allDay", "scope", "effect", "type" ], "type": "object" }, "maxItems": 100, "type": "array" }, "nextCursor": { "anyOf": [ { "maxLength": 4096, "type": "string" }, { "type": "null" } ], "description": "Cursor for the next page; null on the last page" } }, "required": [ "calendarEvents", "nextCursor" ], "type": "object" } }, { "description": "Use this when someone asks which dentists, dental nurses or assistants patients can book at their practice. Returns up to 100 staff display names for one practice (no contact details or roles). Not for staff holidays or days off.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "clinicId": { "description": "Practice id: 24 lowercase hexadecimal characters", "pattern": "^[0-9a-f]{24}$", "type": "string" } }, "required": [ "clinicId" ], "type": "object" }, "name": "list_clinic_providers", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "providers": { "description": "Display names of staff with a dentist (doctor), nurse or assistant role. Staff identifiers, contact details, role records and clinical data are never returned.", "items": { "additionalProperties": false, "properties": { "displayName": { "maxLength": 200, "type": "string" } }, "required": [ "displayName" ], "type": "object" }, "maxItems": 100, "type": "array" } }, "required": [ "providers" ], "type": "object" } }, { "description": "Use this when someone asks which dental practices they run in DodoDentist, or a practice's id is needed. Returns each practice's id, name, currency, default language and timezone, 20 per page by default. Not for looking up a patient or appointment.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "cursor": { "description": "The nextCursor of the previous page of this listing; absent for the first page", "maxLength": 4096, "type": "string" }, "limit": { "description": "Practices per page, from 1 to 100; defaults to 20", "exclusiveMinimum": 0, "maximum": 100, "type": "integer" } }, "type": "object" }, "name": "list_clinics", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "clinics": { "description": "Dental practices in the signed-in organization, administrative metadata only. Patient, appointment and clinical records are never returned.", "items": { "additionalProperties": false, "properties": { "currency": { "anyOf": [ { "pattern": "^[A-Za-z]{3}$", "type": "string" }, { "type": "null" } ] }, "defaultLocale": { "anyOf": [ { "pattern": "^[a-zA-Z]{2,3}([_-][a-zA-Z0-9]{2,8}){0,2}$", "type": "string" }, { "type": "null" } ] }, "id": { "anyOf": [ { "pattern": "^[0-9a-f]{24}$", "type": "string" }, { "type": "null" } ] }, "lastEditTime": { "anyOf": [ { "maxLength": 32, "type": "string" }, { "type": "null" } ] }, "name": { "maxLength": 200, "type": "string" }, "timezone": { "anyOf": [ { "maxLength": 64, "type": "string" }, { "type": "null" } ] } }, "required": [ "id", "name", "currency", "defaultLocale", "timezone", "lastEditTime" ], "type": "object" }, "maxItems": 100, "type": "array" }, "nextCursor": { "anyOf": [ { "maxLength": 4096, "type": "string" }, { "type": "null" } ], "description": "Cursor for the next page; null on the last page" } }, "required": [ "clinics", "nextCursor" ], "type": "object" } }, { "description": "Use this when someone asks what their dental practice charges for a treatment, such as a cleaning, filling, crown or whitening. Returns catalog treatment names with price and last edit time, alphabetically, 50 per page by default. Not for a patient's treatment history or tooth chart.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "clinicId": { "description": "Only this practice (24 lowercase hexadecimal characters); every practice when absent", "pattern": "^[0-9a-f]{24}$", "type": "string" }, "cursor": { "description": "The nextCursor of the previous page with the same filters; absent for the first page", "maxLength": 4096, "type": "string" }, "limit": { "description": "Treatments per page, from 1 to 100; defaults to 50", "exclusiveMinimum": 0, "maximum": 100, "type": "integer" } }, "type": "object" }, "name": "list_procedures", "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { "nextCursor": { "anyOf": [ { "maxLength": 4096, "type": "string" }, { "type": "null" } ], "description": "Cursor for the next page; null on the last page" }, "procedures": { "description": "Treatment catalog entries in name order. Patient-linked treatments, tooth charts, diagnoses and record identifiers are never returned.", "items": { "additionalProperties": false, "properties": { "lastEditTime": { "anyOf": [ { "maxLength": 32, "type": "string" }, { "type": "null" } ] }, "name": { "maxLength": 200, "type": "string" }, "price": { "anyOf": [ { "maximum": 1000000000000000, "minimum": -1000000000000000, "type": "number" }, { "type": "null" } ], "description": "Price in the practice's currency" } }, "required": [ "name", "price", "lastEditTime" ], "type": "object" }, "maxItems": 100, "type": "array" } }, "required": [ "procedures", "nextCursor" ], "type": "object" } }, { "description": "Open DodoDentist Dental Clinic to browse owned clinics, aggregate schedule counts, booking availability and procedure catalog prices. Read-only clinic administration. Excludes patient records, individual appointments, contact details, diagnoses and clinical data; cannot book, edit or make medical decisions.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": {}, "type": "object" }, "name": "open_dododentist", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "items": { "items": { "additionalProperties": false, "properties": { "defaultLocale": { "anyOf": [ { "maxLength": 32, "type": "string" }, { "type": "null" } ] }, "id": { "anyOf": [ { "maxLength": 200, "type": "string" }, { "type": "null" } ] }, "locales": { "items": { "maxLength": 32, "type": "string" }, "maxItems": 100, "type": "array" }, "logoUrl": { "anyOf": [ { "maxLength": 2048, "type": "string" }, { "type": "null" } ] }, "name": { "maxLength": 200, "type": "string" }, "subtitle": { "maxLength": 300, "type": "string" } }, "required": [ "id", "name", "subtitle", "logoUrl", "defaultLocale", "locales" ], "type": "object" }, "maxItems": 100, "type": "array" }, "truncated": { "type": "boolean" } }, "required": [ "items", "truncated" ], "type": "object" } }, { "description": "Use this when someone wants a quick overview or dashboard of one dental practice. Returns an overview card with the practice's details, appointment counts for the next 7 days, how many staff take bookings, open online-booking slots and up to 12 treatment prices (no patient or clinical data). Not for a single patient or appointment.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "clinicId": { "description": "Practice id: 24 lowercase hexadecimal characters", "pattern": "^[0-9a-f]{24}$", "type": "string" } }, "required": [ "clinicId" ], "type": "object" }, "name": "show_clinic_overview", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "appointmentCount": { "maximum": 100, "minimum": 0, "type": "integer" }, "appointmentCountIsLowerBound": { "type": "boolean" }, "availabilityDays": { "items": { "additionalProperties": false, "properties": { "count": { "maximum": 100, "minimum": 0, "type": "integer" }, "day": { "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "type": "string" } }, "required": [ "day", "count" ], "type": "object" }, "maxItems": 7, "type": "array" }, "availableDayCount": { "maximum": 7, "minimum": 0, "type": "integer" }, "availableSlotCount": { "maximum": 100, "minimum": 0, "type": "integer" }, "clinic": { "anyOf": [ { "additionalProperties": false, "properties": { "currency": { "anyOf": [ { "pattern": "^[A-Za-z]{3}$", "type": "string" }, { "type": "null" } ] }, "defaultLocale": { "anyOf": [ { "pattern": "^[a-zA-Z]{2,3}([_-][a-zA-Z0-9]{2,8}){0,2}$", "type": "string" }, { "type": "null" } ] }, "id": { "anyOf": [ { "pattern": "^[0-9a-f]{24}$", "type": "string" }, { "type": "null" } ] }, "name": { "maxLength": 200, "type": "string" }, "timezone": { "anyOf": [ { "maxLength": 64, "type": "string" }, { "type": "null" } ] } }, "required": [ "id", "name", "currency", "defaultLocale", "timezone" ], "type": "object" }, { "type": "null" } ], "description": "Administrative practice metadata; null when the practice was not found. The overview never includes individual appointment records, patient information, diagnoses, treatment details, notes or other clinical data." }, "procedureCount": { "maximum": 12, "minimum": 0, "type": "integer" }, "procedureCountIsLowerBound": { "type": "boolean" }, "procedures": { "items": { "additionalProperties": false, "properties": { "lastEditTime": { "anyOf": [ { "maxLength": 32, "type": "string" }, { "type": "null" } ] }, "name": { "maxLength": 200, "type": "string" }, "price": { "anyOf": [ { "maximum": 1000000000000000, "minimum": -1000000000000000, "type": "number" }, { "type": "null" } ] } }, "required": [ "name", "price", "lastEditTime" ], "type": "object" }, "maxItems": 12, "type": "array" }, "providerCount": { "maximum": 100, "minimum": 0, "type": "integer" }, "providerCountIsLowerBound": { "type": "boolean" }, "scheduleDays": { "items": { "additionalProperties": false, "properties": { "count": { "maximum": 100, "minimum": 0, "type": "integer" }, "day": { "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "type": "string" } }, "required": [ "day", "count" ], "type": "object" }, "maxItems": 100, "type": "array" }, "scheduleRange": { "additionalProperties": false, "properties": { "endTime": { "maxLength": 32, "type": "string" }, "startTime": { "maxLength": 32, "type": "string" } }, "required": [ "startTime", "endTime" ], "type": "object" } }, "required": [ "clinic", "scheduleRange", "appointmentCount", "appointmentCountIsLowerBound", "scheduleDays", "procedureCount", "procedureCountIsLowerBound", "procedures", "providerCount", "providerCountIsLowerBound", "availableDayCount", "availableSlotCount", "availabilityDays" ], "type": "object" } } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:0f0549c73327ec8efc2c680ef71127f281e661f7fe8d36b3fe23f07b5ecf2a20 | sha256sum