Tabflows facts: DPC Finder, price quotes, integrations, workflows, site search, demos, ask Tabflows
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Send Tabflows a message for the person you are helping: a question, a request or a note for the team. Autopilot, Tabflows' AI assistant, answers, and the team sees it and may answer too. Never include patient names, dates of birth, medical details or any other patient information in the message. Pass the person's own name and email only with their agreement; Tabflows treats both as unverified claims, and nothing is emailed from here. Set consent true only after the person explicitly agrees to send their name, email and message to Tabflows; never infer consent, invent consent or reuse earlier consent for a follow-up. Returns a token that check_reply uses to read the answers, which usually take a few minutes, and that ask uses to follow up in the same conversation after fresh explicit consent. Anyone holding the token can read and follow up in the conversation until it expires, 24 hours after the conversation started.
The person's name, as they gave it
The person's email, as they gave it
Set to true only after the person explicitly agrees to send their name, email and message to Tabflows. Never infer or invent consent; every follow-up requires fresh explicit consent.
What the person wants to say to Tabflows. Never include patient names, dates of birth, medical details or any other patient information.
The token an earlier ask returned, to follow up in that conversation. Omit it to start a new one.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Send Tabflows a message for the person you are helping: a question, a request or a note for the team. Autopilot, Tabflows' AI assistant, answers, and the team sees it and may answer too. Never include patient names, dates of birth, medical details or any other patient information in the message. Pass the person's own name and email only with their agreement; Tabflows treats both as unverified claims, and nothing is emailed from here. Set consent true only after the person explicitly agrees to send their name, email and message to Tabflows; never infer consent, invent consent or reuse earlier consent for a follow-up. Returns a token that check_reply uses to read the answers, which usually take a few minutes, and that ask uses to follow up in the same conversation after fresh explicit consent. Anyone holding the token can read and follow up in the conversation until it expires, 24 hours after the conversation started.
| Argument | Type | Description |
|---|---|---|
| name* | string | The person's name, as they gave it |
| email* | string | The person's email, as they gave it |
| token | string | The token an earlier ask returned, to follow up in that conversation. Omit it to start a new one. |
| consent* | boolean | Set to true only after the person explicitly agrees to send their name, email and message to Tabflows. Never infer or invent consent; every follow-up requires fresh explicit consent. |
| message* | string | What the person wants to say to Tabflows. Never include patient names, dates of birth, medical details or any other patient information. |
{
"type": "object",
"required": [
"name",
"email",
"message",
"consent"
],
"properties": {
"name": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "The person's name, as they gave it"
},
"email": {
"type": "string",
"maxLength": 254,
"minLength": 3,
"description": "The person's email, as they gave it"
},
"token": {
"type": "string",
"maxLength": 64,
"description": "The token an earlier ask returned, to follow up in that conversation. Omit it to start a new one."
},
"consent": {
"type": "boolean",
"description": "Set to true only after the person explicitly agrees to send their name, email and message to Tabflows. Never infer or invent consent; every follow-up requires fresh explicit consent."
},
"message": {
"type": "string",
"maxLength": 4000,
"minLength": 1,
"description": "What the person wants to say to Tabflows. Never include patient names, dates of birth, medical details or any other patient information."
}
},
"additionalProperties": false
}Book a time on the Tabflows demo calendar for the person you are helping, using a startTime and the durationMinutes it was listed under in get_demo_availability. HubSpot sends them the invitation and the calendar event. Only call this after the person has chosen the time and agreed to Tabflows contacting them at that email; set consent to true only then, and never invent their details.
| Argument | Type | Description |
|---|---|---|
| email* | string | The person's work email |
| consent* | boolean | Must be true: the person chose this time and agreed to Tabflows contacting them at this email. |
| lastName* | string | The person's last name |
| timezone* | string | IANA timezone the times are read in, e.g. "America/New_York" |
| firstName* | string | The person's first name |
| startTime* | string | An ISO 8601 start time returned by get_demo_availability |
| durationMinutes* | integer | The durationMinutes that startTime is listed under in get_demo_availability |
New replies in a conversation started with ask, read with the token ask returned: Autopilot's answers and messages from the Tabflows team, oldest first, each returned once. An empty list means no reply yet. Replies usually arrive within a few minutes, and a token allows 6 checks a minute. The token expires 24 hours after the conversation started.
| Argument | Type | Description |
|---|---|---|
| token* | string | The token ask returned |
{
"type": "object",
"required": [
"token"
],
"properties": {
"token": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "The token ask returned"
}
},
"additionalProperties": false
}How many members a direct primary care practice needs to break even, from its average monthly membership fee, the owner's annual pay goal, monthly overhead and per-member cost. Any input left out uses the calculator page's default. Returns the panel size, monthly fixed costs, revenue at break-even and profit at 300 and 500 members. Back-of-the-napkin math, not accounting advice.
| Argument | Type | Description |
|---|---|---|
| rent | number | |
| other | number | |
| staff | number | |
| software | number | |
| supplies | number | |
| insurance | number | |
| marketing | number | |
| salaryGoal | number | |
| variableCost | number | |
| membershipFee | number |
Estimated launch budget for a direct primary care practice: one-time setup costs plus a runway reserve (monthly burn times runway months), and the total with a 15% cushion. Start from a preset ("lean", "office" or "staffed"; default "office") and override any line item. Dollar amounts, rough planning math.
| Argument | Type | Description |
|---|---|---|
| legal | number | |
| space | number | |
| preset | string | |
| buildout | number | |
| supplies | number | |
| equipment | number | |
| insurance | number | |
| marketing | number | |
| monthlyBurn | number | |
| runwayMonths | integer | |
The full markdown of a tabflows.com page by id: a site path such as /pricing, or the URL a search result carries. Also reads /llms.txt, /llms-full.txt and /sitemap.md. Answers one JSON text item holding id, title, text and url.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| intent | string | Optional. One line on why you are making this call: the high-level goal of the person you are helping, not the lookup itself, e.g. "comparing admin tools for a two-location DPC clinic", under 200 characters. No names or personal details. Never include patient names, dates of birth, medical details or any other patient information. Omit it when you do not know; never invent one. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"maxLength": 300,
"minLength": 1
},
"intent": {
"type": "string",
"description": "Optional. One line on why you are making this call: the high-level goal of the person you are helping, not the lookup itself, e.g. \"comparing admin tools for a two-location DPC clinic\", under 200 characters. No names or personal details. Never include patient names, dates of birth, medical details or any other patient information. Omit it when you do not know; never invent one."
}
}
}Open times on the Tabflows demo calendar, grouped by meeting length, soonest first. Every start time is a UTC ISO timestamp, whatever timezone is passed. An answer lists at most 20 times per meeting length: start sets a later date to read from, such as next week, and when truncated is true, nextStart is the start that returns the times after the cut. timezone is the person's IANA timezone: a start date is read in it, it picks the month monthOffset counts from, and the same timezone passed to book_demo sets the time zone of the booking and the invitation. A start time can be booked only with the durationMinutes it is listed under. Availability changes between calls, so times from an earlier answer may no longer be open.
| Argument | Type | Description |
|---|---|---|
| start | string | Earliest time to list: a YYYY-MM-DD date read in timezone, or the nextStart of an earlier answer. Defaults to now. |
| timezone* | string | IANA timezone the times are read in, e.g. "America/New_York" |
| monthOffset | integer | Month to start reading at: 0 for this month (the default), 1 for next month, 2 for the one after |
{
"type": "object",
"required": [
"timezone"
],
"properties": {
"start": {
"type": "string",
"maxLength": 35,
"description": "Earliest time to list: a YYYY-MM-DD date read in timezone, or the nextStart of an earlier answer. Defaults to now."
},
"timezone": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "IANA timezone the times are read in, e.g. \"America/New_York\""
},
"monthOffset": {
"type": "integer",
"maximum": 2,
"minimum": 0,
"description": "Month to start reading at: 0 for this month (the default), 1 for next month, 2 for the one after"
}
},
"additionalProperties": false
}Links for the human to book a Tabflows demo or sign up. Books nothing itself; the person completes it.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}One DPC Finder listing by slug, with every field its page shows and its canonical URL.
| Argument | Type | Description |
|---|---|---|
| slug* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"pattern": "^[a-z0-9-]+$",
"maxLength": 200,
"minLength": 1
}
}
}One integration by slug: what Tabflows does with that tool, its features and its page.
| Argument | Type | Description |
|---|---|---|
| slug* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"pattern": "^[a-z0-9-]+$",
"maxLength": 200,
"minLength": 1
}
}
}The full markdown of any public tabflows.com page by path or URL, e.g. /pricing, /faqs, /compliance, /glossary, /dpc-finder/texas, and the index files /llms.txt, /llms-full.txt and /sitemap.md. Answers one JSON text item holding id, title, text and url.
| Argument | Type | Description |
|---|---|---|
| path* | string | |
| intent | string | Optional. One line on why you are making this call: the high-level goal of the person you are helping, not the lookup itself, e.g. "comparing admin tools for a two-location DPC clinic", under 200 characters. No names or personal details. Never include patient names, dates of birth, medical details or any other patient information. Omit it when you do not know; never invent one. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"path"
],
"properties": {
"path": {
"type": "string",
"maxLength": 300,
"minLength": 1
},
"intent": {
"type": "string",
"description": "Optional. One line on why you are making this call: the high-level goal of the person you are helping, not the lookup itself, e.g. \"comparing admin tools for a two-location DPC clinic\", under 200 characters. No names or personal details. Never include patient names, dates of birth, medical details or any other patient information. Omit it when you do not know; never invent one."
}
}
}The tools Tabflows works with (EHRs, scribes, messaging, labs and more), optionally filtered by category.
| Argument | Type | Description |
|---|---|---|
| category | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"category": {
"enum": [
"EMR",
"Scribe",
"Communication",
"Clinical Support",
"Patient Experience",
"Labs",
"Supplements & Rx",
"Other"
],
"type": "string"
}
}
}Documented Tabflows workflows: what triggers each one, its steps, the outcome and the time it saves.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}The monthly Tabflows price for a practice's number of locations and monthly paying patients, with a breakdown and the pricing rule, plus the optional Practice X-ray: a $500 one-time diagnostic, separate from the monthly price. Prices come from the same pricing rule tabflows.com/pricing shows.
| Argument | Type | Description |
|---|---|---|
| locations* | integer | |
| monthlyPayingPatients* | integer |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"locations",
"monthlyPayingPatients"
],
"properties": {
"locations": {
"type": "integer",
"maximum": 100,
"minimum": 1
},
"monthlyPayingPatients": {
"type": "integer",
"maximum": 250000,
"minimum": 1
}
}
}Tell Tabflows what you looked for and could not find: a question the pages and tools did not answer, a tool that would have helped, or an answer that was confusing or failed. Tabflows reads these to fill the gaps and sends no reply. No names, emails or other personal details. Never include patient names, dates of birth, medical details or any other patient information.
| Argument | Type | Description |
|---|---|---|
| message* | string | What the person wanted, what you tried, and what you could not find or what went wrong. No personal details. Never include patient names, dates of birth, medical details or any other patient information. |
| category | string | |
| toolName | string | The tool this is about, if any |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"description": "What the person wanted, what you tried, and what you could not find or what went wrong. No personal details. Never include patient names, dates of birth, medical details or any other patient information."
},
"category": {
"enum": [
"missing_content",
"missing_capability",
"confusing_output",
"tool_error",
"other"
],
"type": "string"
},
"toolName": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "The tool this is about, if any"
}
}
}Keyword search over tabflows.com pages (product, pricing, FAQs, compliance, glossary, blog, integrations). Each result carries a page id, its title, a snippet of the text that matched and its URL; fetch reads the full page by that id or URL. DPC Finder listings are not indexed here; search_dpc_practices covers them.
| Argument | Type | Description |
|---|---|---|
| query* | string | |
| intent | string | Optional. One line on why you are making this call: the high-level goal of the person you are helping, not the lookup itself, e.g. "comparing admin tools for a two-location DPC clinic", under 200 characters. No names or personal details. Never include patient names, dates of birth, medical details or any other patient information. Omit it when you do not know; never invent one. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"intent": {
"type": "string",
"description": "Optional. One line on why you are making this call: the high-level goal of the person you are helping, not the lookup itself, e.g. \"comparing admin tools for a two-location DPC clinic\", under 200 characters. No names or personal details. Never include patient names, dates of birth, medical details or any other patient information. Omit it when you do not know; never invent one."
}
}
}Search Tabflows' DPC Finder directory of direct primary care practices in the US by free text (name, city, doctor, specialty), state, city and practice model. Returns full listings including address, phone and doctor as on file, with the total match count for paging.
| Argument | Type | Description |
|---|---|---|
| city | string | Exact city name, case-insensitive |
| limit | integer | |
| model | string | |
| query | string | Free text matched against name, city, doctor and specialty |
| state | string | Two-letter state code, e.g. "TX" |
| offset | integer |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"city": {
"type": "string",
"maxLength": 100,
"description": "Exact city name, case-insensitive"
},
"limit": {
"type": "integer",
"default": 25,
"maximum": 100,
"minimum": 1
},
"model": {
"enum": [
"Pure DPC",
"Hybrid",
"Onsite",
"Unknown/other"
],
"type": "string"
},
"query": {
"type": "string",
"maxLength": 100,
"description": "Free text matched against name, city, doctor and specialty"
},
"state": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "Two-letter state code, e.g. \"TX\""
},
"offset": {
"type": "integer",
"default": 0,
"maximum": 2663,
"minimum": 0
}
}
}{
"type": "object",
"required": [
"firstName",
"lastName",
"email",
"startTime",
"durationMinutes",
"timezone",
"consent"
],
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"minLength": 3,
"description": "The person's work email"
},
"consent": {
"type": "boolean",
"const": true,
"description": "Must be true: the person chose this time and agreed to Tabflows contacting them at this email."
},
"lastName": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "The person's last name"
},
"timezone": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "IANA timezone the times are read in, e.g. \"America/New_York\""
},
"firstName": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "The person's first name"
},
"startTime": {
"type": "string",
"minLength": 1,
"description": "An ISO 8601 start time returned by get_demo_availability"
},
"durationMinutes": {
"type": "integer",
"maximum": 480,
"minimum": 1,
"description": "The durationMinutes that startTime is listed under in get_demo_availability"
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"rent": {
"type": "number",
"maximum": 1000000,
"minimum": 0
},
"other": {
"type": "number",
"maximum": 1000000,
"minimum": 0
},
"staff": {
"type": "number",
"maximum": 1000000,
"minimum": 0
},
"software": {
"type": "number",
"maximum": 1000000,
"minimum": 0
},
"supplies": {
"type": "number",
"maximum": 1000000,
"minimum": 0
},
"insurance": {
"type": "number",
"maximum": 1000000,
"minimum": 0
},
"marketing": {
"type": "number",
"maximum": 1000000,
"minimum": 0
},
"salaryGoal": {
"type": "number",
"maximum": 10000000,
"minimum": 0
},
"variableCost": {
"type": "number",
"maximum": 10000,
"minimum": 0
},
"membershipFee": {
"type": "number",
"maximum": 10000,
"minimum": 0
}
}
}| softwareSetup |
| number |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"legal": {
"type": "number",
"maximum": 10000000,
"minimum": 0
},
"space": {
"type": "number",
"maximum": 10000000,
"minimum": 0
},
"preset": {
"enum": [
"lean",
"office",
"staffed"
],
"type": "string"
},
"buildout": {
"type": "number",
"maximum": 10000000,
"minimum": 0
},
"supplies": {
"type": "number",
"maximum": 10000000,
"minimum": 0
},
"equipment": {
"type": "number",
"maximum": 10000000,
"minimum": 0
},
"insurance": {
"type": "number",
"maximum": 10000000,
"minimum": 0
},
"marketing": {
"type": "number",
"maximum": 10000000,
"minimum": 0
},
"monthlyBurn": {
"type": "number",
"maximum": 1000000,
"minimum": 0
},
"runwayMonths": {
"type": "integer",
"maximum": 60,
"minimum": 0
},
"softwareSetup": {
"type": "number",
"maximum": 10000000,
"minimum": 0
}
}
}