personaleasy-mcp-server
This MCP server lets you query read-only data from the PersonalEasy / EasyDental / DentalKids dental clinic API.
List appointments: fetch appointments within a date range, optionally filtered by unit (personaleasy_get_agendamentos).
Get production KPIs: retrieve dashboard production metrics for a period, optionally filtered by unit and/or provider (personaleasy_get_kpi_producao).
Find provider by CPF: look up a provider's ID and name using their CPF in 999.999.999-99 format (personaleasy_get_prestador_por_cpf).
List active units: get the ID and name of all active service units (personaleasy_get_unidades).
All tools are read-only and safe to use for reporting and operational queries.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@personaleasy-mcp-servershow me appointments for next week at the main unit"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
personaleasy-mcp-server
MCP server for the PersonalEasy API | EasyDental Cloud | DentalKids.
Tools
Tool | Description | Parameters |
| Fetches appointments in the period |
|
| Production KPIs for dashboard |
|
| Provider ID and name by CPF |
|
| Lists active service units | — |
All tools are read-only (readOnlyHint: true).
Related MCP server: open-dental-mcp
Installation
npm install
npm run buildCredentials
Credentials are never kept in the code. Set them via environment variables:
PERSONALEASY_API_KEY— the api-key (headerx-api-key)PERSONALEASY_CLIENT_ID— the client IDPERSONALEASY_BASE_URL— optional, defaults tohttps://prsrb.onrender.com/v1/rpc
For local testing, copy .env.example to .env and fill it in. The .env file is in .gitignore — do not version it or share it.
Configuration in Claude Code
claude mcp add personaleasy --env PERSONALEASY_API_KEY=SUA_KEY --env PERSONALEASY_CLIENT_ID=SEU_CLIENT_ID -- node D:/MCPS/personaleasy-mcp-server/dist/index.jsConfiguration in Claude Desktop
In claude_desktop_config.json:
{
"mcpServers": {
"personaleasy": {
"command": "node",
"args": ["D:/MCPS/personaleasy-mcp-server/dist/index.js"],
"env": {
"PERSONALEASY_API_KEY": "SUA_KEY",
"PERSONALEASY_CLIENT_ID": "SEU_CLIENT_ID"
}
}
}
}Deploy on Easypanel (Docker)
The project has two execution modes:
stdio (
dist/index.js) — local use (Claude Code / Claude Desktop)HTTP (
dist/http.js) — remote use; this is the mode used by the Dockerfile
On Easypanel, create an App service pointing to this repository (build via Dockerfile) and configure the environment variables:
Variable | Required | Description |
| yes | API api-key |
| yes | Client ID |
| recommended | Bearer token required on the |
| no | defaults to 3000 |
Expose port 3000 on the service. Endpoints:
POST /mcp— MCP endpoint (Streamable HTTP, stateless)GET /health— healthcheck
Production instance
Base URL:
https://dk-projetos-mcps.nv8gf3.easypanel.hostHealthcheck:
GET https://dk-projetos-mcps.nv8gf3.easypanel.host/health→{"status":"ok"}MCP Endpoint:
POST https://dk-projetos-mcps.nv8gf3.easypanel.host/mcp
To connect an MCP client to this instance:
claude mcp add --transport http personaleasy https://dk-projetos-mcps.nv8gf3.easypanel.host/mcp --header "Authorization: Bearer SEU_MCP_AUTH_TOKEN"Replace SEU_MCP_AUTH_TOKEN with the value set in the MCP_AUTH_TOKEN variable of the Easypanel service.
Important: without
MCP_AUTH_TOKENconfigured in the service, anyone with this URL can query the clinic's data. Make sure the variable is set in production.
Underlying API
All calls go to a single RPC endpoint:
POST {BASE_URL}
Headers: x-api-key
Body: { "clientId": "...", "method": "RPCGet...", "params": { ... } }Methods used: RPCGetAgendamentos, RPCGetKPIPrd, RPCGetPrestadorCPF, RPCGetUnidadeAtendimento.
Available Tools
4 toolspersonaleasy_get_agendamentosBuscar agendamentosARead-only
Retorna os agendamentos no período informado. Opcionalmente filtra por unidade de atendimento (use personaleasy_get_unidades para descobrir os nomes válidos).
| Name | Required | Description | Default |
|---|---|---|---|
| dt_inicio | Yes | Data inicial do período, formato YYYY-MM-DD (ex.: 2026-01-01) | |
| dt_termino | Yes | Data final do período, formato YYYY-MM-DD (ex.: 2026-01-31) | |
| nm_unidade | No | Nome da unidade de atendimento para filtrar (ex.: 'Valinhos'). Vazio retorna todas. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, covering safety and completeness. The description adds that it returns appointments in a period, but does not disclose any additional behavioral traits (e.g., error handling, performance, or what happens with invalid dates). It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences that cover purpose, optional filtering, and a cross-reference. Every word earns its place with no filler or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite the annotations covering read-only and open-world aspects, the description omits any information about the return value format (e.g., fields, structure). Since there is no output schema, the agent is left guessing what the response looks like. Additionally, it does not mention date range limits or error scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds value by telling the agent that the nm_unidade parameter can be filled using personaleasy_get_unidades, providing a cross-reference beyond the schema's inline description. This helps the agent understand where to obtain valid values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns appointments within a specified date period, with optional filtering by unit. The verb 'retorna' and resource 'agendamentos' are explicit. It distinguishes from sibling tools like personaleasy_get_kpi_producao (KPIs) and personaleasy_get_prestador_por_cpf (provider lookup) by focusing on schedule data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a helpful cross-reference to personaleasy_get_unidades for discovering valid unit names, but it does not give explicit guidance on when to use this tool versus alternatives (e.g., when to use personaleasy_get_prestador_por_cpf instead). No 'when not to use' or context for choosing among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
personaleasy_get_kpi_producaoKPIs de produçãoARead-only
Retorna dados de produção (KPIs de dashboard) no período informado. Filtros opcionais por unidade e por prestador.
| Name | Required | Description | Default |
|---|---|---|---|
| dt_inicio | Yes | Data inicial do período, formato YYYY-MM-DD | |
| dt_termino | Yes | Data final do período, formato YYYY-MM-DD | |
| nm_unidade | No | Nome da unidade para filtrar. Vazio retorna todas. | |
| nm_prestador | No | Nome do prestador para filtrar. Vazio retorna todos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is clear. The description adds no behavioral contradictions and is consistent with annotations, which is sufficient. No additional behavioral details are needed beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that efficiently conveys the core purpose and filter options. It is front-loaded with the main action ('Retorna dados de produção') and uses no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has 4 parameters with complete schema descriptions, no output schema, and is a simple read-only KPI retrieval, the description adequately covers the tool's functionality. It does not need to explain return values explicitly since the dashboard KPI context is implied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all four parameters with descriptions, formats, and defaults. The description adds no new information about parameters beyond what the schema provides, meeting the baseline but not exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool returns production KPI (dashboard) data within a given period, mentioning optional filters for unit and provider. While it effectively describes the tool's purpose, it does not explicitly distinguish itself from sibling tools beyond implying it focuses on production KPIs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates when to use the tool (when production KPI data is needed) and notes optional filters, but it offers no guidance on when to NOT use it or how it compares to sibling tools (e.g., scheduling or provider lookups). Usage context is implied but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
personaleasy_get_prestador_por_cpfBuscar prestador por CPFARead-only
Retorna o ID e o Nome do prestador a partir do CPF.
| Name | Required | Description | Default |
|---|---|---|---|
| cpf | Yes | CPF do prestador no formato 999.999.999-99 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the tool is known to be safe and side-effect-free. The description adds that it returns only ID and Nome, which is useful context. However, it does not explain what happens if the CPF is not found (likely empty or error? no indication).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no unnecessary words. It immediately states the output fields and the input key. Perfectly concise for a simple lookup tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (1 parameter, no output schema, simple lookup), the description is mostly adequate. However, it lacks mention of error handling (e.g., CPF not found) and does not specify if the result is guaranteed to be unique. Completeness is acceptable but not thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (only one parameter 'cpf' with format and description). The description does not add further meaning beyond what the schema already provides—it repeats the purpose. Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Retorna o ID e o Nome do prestador a partir do CPF' clearly states the verb (retorna) and resource (prestador por CPF), specifying the key fields returned (ID, Nome). It distinguishes from sibling tools which handle appointments, KPIs, and units.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for searching a provider by CPF, but does not explicitly state when to use this tool versus alternatives, nor does it mention any prerequisites (e.g., need for exactly matching CPF). No guidance on when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
personaleasy_get_unidadesListar unidades ativasARead-only
Retorna o ID e o Nome das unidades de atendimento ativas.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, covering safety and data volatility. The description adds that it returns ID and Name of active units. No further behavioral traits (e.g., pagination, ordering, result limits) are disclosed, which would be useful but are not critical given the tool's simplicity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence that directly conveys the action, resource, and output fields. Every word is necessary and there is no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless read-only listing tool with openWorldHint, the description covers the essential output (ID and Name of active units). The lack of output schema is compensated by the explicit mention of fields. It does not mention response structure or potential edge cases (e.g., empty list), but these are minor omissions given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no parameters (100% coverage by definition). The description correctly implies no inputs are needed. With zero parameters, the baseline is 4; the description does not need to add parameter-level detail beyond stating the output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Retorna' (returns) and the resource 'unidades de atendimento ativas' (active service units), specifying that ID and Name are provided. It distinguishes well from sibling tools, which cover appointments, KPI, and provider lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied by the tool's purpose—use it to list active units. However, there is no explicit guidance on when to prefer this tool over alternatives, nor any prerequisites or caveats. For a simple parameterless tool, this is adequate but not exemplary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
4 tool updates
v1.0.0- First observed
personaleasy_get_agendamentos - First observed
personaleasy_get_kpi_producao - First observed
personaleasy_get_prestador_por_cpf - First observed
personaleasy_get_unidades
TDQS
Each tool targets a distinct resource: appointments (agendamentos), production KPIs, provider lookup by CPF, and units. There is no overlap in purpose, and the descriptions clearly differentiate them.
All tools follow the pattern `personaleasy_get_<resource>`, using the same prefix and verb. The resource names are in Portuguese, which is consistent with the domain, though the prefix adds redundancy.
Four tools is appropriate for a focused server that provides read-only access to core entities (appointments, KPIs, providers, units). It is not too few for the apparent scope, and each tool serves a clear purpose.
The tool set covers reading key entities, but there are obvious gaps: no filtering by provider for appointments, no tool for patients or procedures, and only a CPF-based lookup for providers. Write operations (create, update, delete) are absent, limiting the surface to querying.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Read-only MCP: US dental intel, all-category Medicaid fee schedules, dentist lookup. Free tier.
MCP server for lacita - appointment management software
Hosted MCP server for the Healthie EHR & telehealth API: patients, appointments, charting, tasks.
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
Related MCP Servers
- AlicenseBqualityCmaintenanceMCP server for the DataGate billing platform API, providing read-only tools to manage customers, invoices, products, agreements, sites, and payments.13MIT
- AlicenseAqualityBmaintenanceEnables interaction with Open Dental practice management software, allowing reading of patients, appointments, providers, procedures, and recalls, as well as writing communications back to patient charts via MCP clients.145MIT
- AlicenseAqualityCmaintenanceMCP server for interacting with Realm MinistryPlatform data, enabling queries, record creation, and updates from any MCP client.1MIT
- AlicenseAqualityAmaintenanceRead-only MCP server for licensed Healthpoint HL7 FHIR API access.101Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/marqprochat/mcpdentalkids'
If you have feedback or need assistance with the MCP directory API, please join our Discord server