Skip to main content
Glama

simplepractice-mcp

MCP server for the SimplePractice Client Portal — the side a practice's clients log into, not the clinician side. Appointments, billing, paperwork, and announcements, read over the portal's own JSON:API.

Developed and maintained by AI (Claude Code). Use at your own discretion.

What it reads

Tool

What it gives you

simplepractice_get_account

practice, current client, every client this login covers, cancellation policy, feature permissions

simplepractice_list_appointments

scheduled or requested appointments, with clinician and location

simplepractice_list_billing_items

invoices · statements · superbills · receipts · account history

simplepractice_get_billing_overview

balance due and per-category counts

simplepractice_list_payment_methods

saved cards — brand, last four, expiry

simplepractice_list_document_requests

paperwork sent to you, with an outstanding-only filter

simplepractice_get_document_request

one request in full, with its questions and answers

simplepractice_list_documents

files the practice has shared

simplepractice_list_announcements

practice announcements, with unread counts

simplepractice_session_status · _request_sign_in_link · _verify_sign_in_token · _verify_sign_in_pin · _sign_out

sign-in

simplepractice_healthcheck

Verify credentials and upstream reachability; reports failures as data, not exceptions

Everything is read-only. Cancelling, signing, and paying happen in the portal.

The reads that answer with a SimplePractice record rather than a projection — appointments, billing items, the billing overview, one document request, announcements — take a view. It defaults to compact, which returns the slim projection where this server has one and otherwise drops logo and avatar URLs a model cannot see; view: "full" returns the record untouched. simplepractice_list_documents deliberately takes none: what it returns is the file reference, and a shared scan is a .jpg.

Related MCP server: LibreLink Up B2B (CGM clínica)

Setup

npm install -g simplepractice-mcp

There is nothing to configure. The practice comes from your sign-in link.

Variable

SIMPLEPRACTICE_PRACTICE

optional — pins the server to one practice (slug or host)

SIMPLEPRACTICE_SESSION_FILE

optional — session path (default ~/.simplepractice-mcp/session.json, written 0600)

Signing in

The Client Portal has no password. SimplePractice emails a one-time link (or a 6-digit PIN); you trade it for a session cookie:

  1. Open the email your provider sent, copy the link.

  2. simplepractice_verify_sign_in_token { link } — pass the whole link.

The link is https://<practice>.clientsecure.me/sign-in/token#<TOKEN>, so one paste carries both halves of what the server needs: the token is the # fragment, and the host names the practice. Nothing is hardcoded, and the stored session remembers the practice for every later run — simplepractice_session_status reports which practice is in play and whether it came from a link, the environment variable, or the saved session.

To have a fresh link sent rather than using one you already have, name the practice once:

simplepractice_request_sign_in_link { email, practice: "achievebalancetherapy", confirm: true }

practice can be omitted whenever the server already knows the practice — from an earlier sign-in, or from SIMPLEPRACTICE_PRACTICE.

Two sign-in links name no practice, and fall back to whichever one is already known: the mobile-app variant SimplePractice sends (https://clientsecure.me/client-portal-api/sign-in/token#<TOKEN>, pointed at the bare apex), and a bare token pasted without its link. A link on any host outside *.clientsecure.me is never adopted — the token is not sent there.

Links are single-use — replaying one answers 401 "Authorization has already been used or expired" — and last 24 hours. The request endpoint is rate-limited per address and per IP, which is why sending is confirm-gated: a retry loop locks you out of the only way in. There is no refresh token; when the session lapses, you sign in again.

The whole chain is verified end to end against a live portal — request, the emailed link, the exchange returning verified plus a session cookie, and an authenticated read with that new session.

Because that flow needs nothing but HTTP and your inbox, this server has no browser dependency and can run anywhere.

Without the server

skills/simplepractice-fpx does the same reads with curl, either signing in by magic link or lifting the session cookie from a browser tab with fpx.

Notes from building this

The portal is an Ember app that ships public sourcemaps, so its models, adapters and routes are readable directly — docs/SIMPLEPRACTICE-API.md records the endpoints and the traps, all confirmed against a live portal:

  • The SPA catch-all answers HTTP 200 with text/html for any path the API does not define. /cards and /client-billing-overviews look like working, empty endpoints and are not endpoints at all — both are include relationships of /clients/<id>.

  • hasDocumentPdf, a card's isDefault, and the client's permissions blob are all strings, not booleans or objects.

  • Billing pages by cursor (page[before] = a row's cursorId), appointments page by number. The two are not interchangeable.

Development

npm install
npm run build
npm test              # 214 tests
npm run test:coverage # 100% enforced
npm run typecheck     # vitest does not run tsc — this does

License

MIT

Available Tools

15 tools
simplepractice_get_accountA
Read-only

The practice, the signed-in client, and every client this login can see. One portal login is a "client access" and may cover more than one client — a parent seeing two children, say — so clients is always a list.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already signals a safe read operation. The description adds valuable behavioral context by explaining that a single portal login may cover multiple clients and that clients is always a list, which helps the agent anticipate the return shape. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no fluff. It front-loads the core content (practice, client, clients list) and uses an illustrative example to clarify a non-obvious behavior. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with a readOnly annotation and no output schema, the description sufficiently explains the conceptual return (practice, signed-in client, all visible clients). It lacks explicit output format details, but given the simplicity and existing annotations, it is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters, the schema already fully covers parameter documentation (100% coverage). The description has no need to add parameter meaning, and adheres to the baseline of 4 for tools with no parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns the practice, the signed-in client, and every client visible to the login, with the specific clarification that clients is always a list. This precise scope distinguishes it from sibling tools that focus on specific operations like session status or sign-in links.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what the tool returns and clarifies the multi-client nature, but it does not explicitly state when to use this tool versus alternatives. Since it's a general 'get account' tool, usage is implied, but no explicit exclusions or comparisons to siblings are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simplepractice_get_billing_overviewA
Read-only

Balance due and per-category counts for the Client Portal account. Cheaper than paging the billing collections just to find out whether anything is there.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns the slim projection where one exists and strips image URLs elsewhere; "full" returns SimplePractice's whole records.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already covers the safety profile. The description adds a lightweight 'cheaper' performance hint and indicates the aggregate nature of the response, but it does not disclose other behavioral details such as exact response shape or which categories are counted. With annotations present, this is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no wasted words. The primary purpose is front-loaded, and the second sentence adds a valuable usage cue without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a low-complexity tool with one optional parameter and no output schema. The description states what the tool returns and why it is preferable to item-level billing calls. It is nearly complete, though the exact output structure is left unspecified in the absence of an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the only parameter, 'view', is fully documented with enum values and explanations. The tool description adds no additional parameter semantics, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as returning 'Balance due and per-category counts for the Client Portal account,' which is a specific output and resource. It also distinguishes itself from item-level billing tools by positioning itself as a quick summary rather than 'paging the billing collections.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives context for when to use this tool: when you want to know whether anything is owed without paging through billing collections. However, it does not explicitly name the alternative sibling tool or state when not to use it, so the guidance is clear but not fully explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simplepractice_get_document_requestA
Read-only

One document request in full, including its body or its questions and the answers already given.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe document request id.
viewNoResponse shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns the slim projection where one exists and strips image URLs elsewhere; "full" returns SimplePractice's whole records.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true, so the description does not need to establish that this is a safe read. The description adds useful context about what the response contains: body or questions and existing answers. It does not describe further behavior like pagination or error cases, but for a simple get-by-id tool this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, compact sentence that front-loads the core purpose ('One document request in full') and immediately clarifies what 'full' means by naming body/questions/answers. Every word earns its place; there is no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only get-by-id tool, the description plus the fully documented input schema and readonly annotation give an agent enough to select and invoke it correctly. It does not describe the output shape fully, but that is not required given the straightforward resource and available schema information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents both parameters at 100% coverage, including the view enum and its compact/full effects. The description adds no parameter-specific meaning beyond the schema, so it meets the baseline but does not exceed it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the resource ('document request') and the scope ('one... in full'), which clearly implies fetching a single item rather than a list. It does not explicitly name a sibling to distinguish itself, but 'one' versus the sibling 'list_document_requests' makes the purpose reasonably clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The singular framing implies the tool is for retrieving one specific document request by id, rather than listing all requests. However, it does not explicitly say when to prefer this over list_document_requests or any other alternative, so usage guidance is only implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simplepractice_healthcheckVerify credentials and upstream reachabilityA
Read-onlyIdempotent

Resolves the credential the way real tools do, then makes one authenticated request to clientsecure.me. Reports which source supplied the credential, whether clientsecure.me accepted it, the round-trip time, and a plain-English hint distinguishing 'no credential' from 'credential rejected' from 'a clientsecure.me-side problem'. Call this when a real tool fails and you want to know which hop broke. Read-only; never returns the credential itself.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint/idempotentHint annotations, the description discloses exactly what the tool does (one authenticated request), what it reports (credential source, acceptance, RTT, plain-English hint), and an important safety property (never returns the credential itself). This gives the agent a precise behavioral model.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: what it does, what it reports, when to call it, and its read-only safety guarantee. The description is dense but not bloated, and it leads with the core action before explaining outputs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With zero parameters, no output schema, and safety covered by annotations, the description still supplies the essential response semantics (what gets reported and how to interpret the hint). An agent has everything needed to invoke the tool and understand its result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and 100% schema description coverage, so there is no parameter semantics burden. The baseline of 4 applies because no parameter explanation is needed; the description correctly focuses on behavior instead.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific diagnostic action (resolves the credential, makes one authenticated request, reports results) and clearly sets it apart from sibling session, sign-in, and data tools. An agent can tell this is the reachability/credential healthcheck without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit trigger: 'Call this when a real tool fails and you want to know which hop broke.' This is clear context for use, though it does not explicitly name sibling alternatives or when-not scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simplepractice_list_announcementsB
Read-only

Announcements the practice has posted to the Client Portal. readAt is null on unread ones.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns the slim projection where one exists and strips image URLs elsewhere; "full" returns SimplePractice's whole records.
pageSizeNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true, so the safe read-only nature is established. The description adds useful context about the readAt field being null for unread announcements and scopes the data to practice-posted Client Portal announcements, but it does not disclose ordering, pagination behavior, or response shape beyond that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is only two short sentences with no filler. The core subject is front-loaded, and the readAt clarification earns its place by explaining a meaningful field semantic.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with no required parameters, the description plus the detailed view parameter schema is sufficient for an agent to call it correctly. The lack of an output schema is partially offset by the readAt detail and the schema's description of compact versus full response shapes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%, with the view parameter already well described and pageSize being self-explanatory through its name, default, and maximum. The tool description does not add parameter-level meaning, but the schema carries enough weight for these two simple optional parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource as announcements posted by the practice to the Client Portal, which distinguishes it from sibling list tools like list_appointments or list_documents. It does not explicitly include a verb such as 'lists' or 'retrieves,' but the tool name and phrasing make the operation obvious.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance about when to use this tool versus other listing tools, nor does it state any exclusions or prerequisites. The intended use is only implied by the resource name and the brief description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simplepractice_list_appointmentsA
Read-only

Appointments from the Client Portal. status "scheduled" returns confirmed/upcoming ones; "requested" returns those still awaiting the practice's confirmation. Pages by number.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
viewNoResponse shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns the slim projection where one exists and strips image URLs elsewhere; "full" returns SimplePractice's whole records.
statusNoWhich side of the pending-confirmation filter to read.scheduled
pageSizeNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already communicates that this is a safe read operation. The description adds useful behavioral context around status filtering and pagination, but it does not disclose pageSize behavior, defaults, or response shape, leaving the behavioral picture incomplete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short, front-loaded, and contains no filler. 'Pages by number' is concise but slightly cryptic, and the opening phrase is a fragment rather than a full purpose statement, preventing a top score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is adequate for a read-only list tool: it covers the resource, status semantics, and pagination, while schema defaults handle some missing detail. However, pageSize is unexplained and there is no output schema or description of what the returned appointments contain, so it is minimally viable rather than complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50%, so the description needs to compensate for undocumented parameters. It clarifies the status enum meanings and mentions pagination by number, but the pageSize parameter is left undocumented in both the schema and the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource as Client Portal appointments and explains the key status distinction between scheduled and requested results. The verb is implied via the tool name and the word 'returns' rather than explicitly stated as 'list/get', so it stops just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit, actionable guidance on when to use the 'scheduled' versus 'requested' status values, which is the main decision an agent faces. It does not discuss alternative sibling tools, but the resource scope is unambiguous enough for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simplepractice_list_billing_itemsA
Read-only

Invoices, statements, superbills, receipts, or account history from the Client Portal. An empty list is a real answer — many practices bill entirely outside the portal. Pages by cursor: pass the returned nextCursor as "before".

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoinvoice
viewNoResponse shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact returns the slim projection where one exists and strips image URLs elsewhere; "full" returns SimplePractice's whole records.
beforeNoCursor for the next page — the nextCursor from a previous call.
pageSizeNo

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the minimal isSearch/systemOnly annotations, the description discloses two non-obvious behaviors: empty results are meaningful rather than errors, and pagination uses a nextCursor that must be passed as 'before'. This is useful behavioral context that annotations do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each carrying essential information: what the tool returns, the empty-list caveat, and pagination mechanics. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the core list behavior, empty results, and pagination intent, which is strong for a simple two-parameter tool. However, the cursor instruction cannot be satisfied with the given input schema, and because there is no output schema the description remains the only source for return expectations. That gap prevents it from being fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The prose restates the kind enum values and adds portal context, but the schema already supplies those enums with far better precision. More importantly, the pagination instruction references a 'before' parameter that is absent from the input schema, so an agent following the description cannot actually execute pagination. The view parameter is only documented by the schema, not enhanced by the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly enumerates the resource scope: invoices, statements, superbills, receipts, or account history from the Client Portal. It is distinguishable from sibling list tools like appointments and documents, though it does not explicitly name the alternative or state the verb 'list'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives important operational context: an empty list is a legitimate answer because many practices bill outside the portal, and it explains cursor pagination. However, it does not state when to prefer this tool over alternatives or provide exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simplepractice_list_document_requestsA
Read-only

Paperwork the practice has sent — consents, questionnaires, contact and insurance forms, Good Faith Estimates, shared files. Use outstandingOnly to see just what still needs the client's attention.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageSizeNo
includeBodyNoInclude the full document body/questions. Off by default — these are long.
outstandingOnlyNoReturn only requests that are not completed or locked.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the bar is lower. The description adds valuable context about the nature of the resource (types of forms) and the practical meaning of outstandingOnly, going beyond the annotation. It does not disclose any undocumented mutations or side effects, but none exist given the read-only hint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler. The main purpose is front-loaded, and the outstandingOnly hint adds actionable value without redundancy. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description should convey the return concept. It implies a list of requests by the verb 'list' and enumerates categories. Pagination is partially covered by the pageSize parameter in the schema. Combined with the readOnly annotation, the description is sufficient for an agent to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%, with includeBody and outstandingOnly documented in the schema. The description adds a human-oriented rationale for outstandingOnly ('see just what still needs the client's attention'), which is more interpretable than the schema's 'not completed or locked.' It does not add new meaning for pageSize, but that parameter is intuitive and covered by its name and default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb+resource: lists document requests (paperwork the practice has sent). It enumerates concrete types (consents, questionnaires, etc.), which distinctively frames what this tool returns. The mention of outstandingOnly further clarifies the function, making it unmistakable what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage guidance is implied rather than explicit. The description says 'Use outstandingOnly to see just what still needs the client's attention,' which is a parameter-level hint, but it does not compare this tool to siblings like get_document_request or list_documents, nor state when to prefer one over the other. Context is present but no explicit exclusions or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simplepractice_list_documentsC
Read-only

Files the practice has shared through the Client Portal.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageSizeNo

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already covers the safety profile. The description adds that the files are 'shared through the Client Portal', providing a bit of context. However, it does not disclose anything like pagination behavior, sorting, or empty results. With the annotation present, this is a minimal but acceptable addition.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, no wasted words. It is concise and to the point. However, it may be under-specified for a tool with a parameter, but conciseness itself is well executed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description lacks essential context for a tool with no output schema. It does not explain the pageSize parameter, pagination, or any ordering. While it clarifies the return type (files shared via Client Portal), it is incomplete for an agent to call it correctly without further inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has zero description coverage, so the description should compensate. It does not mention the only parameter, pageSize, at all. The agent receives no guidance on how to use this parameter (e.g., default, max, or its effect on results). This is a clear gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the resource (files/documents) and context (shared via Client Portal), which clearly indicates a read/list operation. It distinguishes from sibling tools like list_document_requests by specifying actual files rather than requests. The verb is implicit rather than explicit, but the tool name reinforces it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives such as list_document_requests or get_document_request. It only defines what it returns, without clarifying selection criteria or context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simplepractice_list_payment_methodsA
Read-only

Payment methods saved to the Client Portal — brand, last four digits, and expiry. No full card numbers.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds valuable behavioral detail beyond annotations: it specifies that full card numbers are NOT returned, which is a critical privacy constraint. It also enumerates the exact fields returned (brand, last four digits, expiry). This is strong supplementary disclosure for a simple read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the core purpose and immediately states the key constraint (no full card numbers). Every word earns its place, and there is no fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only list tool with no output schema, the description is largely complete. It tells the agent what data to expect and what not to expect. It does not discuss response format or pagination, but these are minor gaps for such a simple tool, and the annotation covers the safety profile.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, and schema description coverage is 100% (vacuous). The baseline for zero-parameter tools is 4, and the description does not need to explain parameters. It adds no parameter-specific information, which is appropriate here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the resource (payment methods saved to the Client Portal) and the specific data returned (brand, last four digits, expiry). It is distinct from all sibling tools, which deal with sessions, appointments, billing, documents, etc. The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It does not mention any alternative tools or scenarios where it should or should not be used. While the tool is obviously for listing saved payment methods, the absence of explicit usage context leaves the agent to infer intent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simplepractice_session_statusA
Read-only

Report whether this server holds a Client Portal session, for which practice, and how that practice was determined (from a sign-in link, from SIMPLEPRACTICE_PRACTICE, or remembered from the stored session). Reads local state only — makes no network call.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, and the description adds the valuable detail that it makes no network call, which is beyond the annotation. It also explains what information is reported (session, practice, determination method), giving a complete picture of behavior without over explaining.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, tightly packed with essential information: what it reports, the three ways practice is determined, and the local/no-network nature. Every word earns its place, and the key action is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a stateless diagnostic tool with no parameters and no output schema, the description fully covers what an agent needs to know: the scope of the check, the report content, and the absence of side effects. The sibling list underscores that this is a lightweight status check, and the description matches.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the description need not document them. The schema coverage is 100% vacuously, and the description adds no parameter-specific information, which is appropriate. The baseline for zero parameters is 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states exactly what the tool does: reports session existence, practice, and determination method. It uses a specific verb ('Report') and a clear resource (Client Portal session), and it distinguishes itself from siblings by focusing on status rather than actions like sign-in or sign-out.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when this tool is appropriate—checking session state—and notes it reads only local state, implying it's a safe, fast diagnostic. It does not explicitly mention alternative tools or exclusions, but the purpose is self-evident given the sibling list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simplepractice_sign_outA
Idempotent

Discard the stored Client Portal session from local state.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already state readOnlyHint=false and idempotentHint=true, indicating a mutating but idempotent operation. The description adds that the action affects local state only, which is helpful context beyond the annotations. However, it does not disclose potential side effects (e.g., whether server-side session is invalidated) or behavior when no session exists. It adds some value without contradicting annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no redundant words. It front-loads the essential action and includes the meaningful qualifier 'from local state.' Every word contributes to understanding the tool's behavior, and it is appropriately sized for a simple operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters, no output schema, straightforward action), the description is largely sufficient. It clearly states what the tool does and its scope. However, it could optionally mention the effect on the user's authentication state (e.g., requiring re-authentication), but that is not essential for correct invocation. The description covers the core functional requirements.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

This tool has zero parameters, and schema description coverage is 100% (vacuously). Per the rubric, a 0-parameter tool receives a baseline of 4. The description does not need to elaborate on parameters since none exist. It effectively communicates that no arguments are required, which is sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Discard the stored Client Portal session from local state.' It specifies the verb (discard), the resource (session), and the scope (local state). This distinguishes it from sibling tools like simplepractice_session_status (which checks status) and simplepractice_request_sign_in_link (which initiates sign-in). The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no explicit guidance on when to use this tool versus alternatives. It does not mention that this should be used when a user explicitly logs out, nor does it contrast with other session-related tools. The tool's purpose is implied by its name and description, but no alternatives or exclusions are mentioned, leaving the agent to infer usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simplepractice_verify_sign_in_pinA

Exchange a 6-digit Client Portal sign-in PIN for a session, for practices that email a code instead of a link. Single-use.

ParametersJSON Schema
NameRequiredDescriptionDefault
pinYes
emailYesThe address the PIN was sent to.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only indicate mutating (readOnlyHint=false) and non-idempotent (idempotentHint=false). The description adds meaningful behavioral detail: it is a single-use exchange that creates a session. This goes beyond annotations by explaining the one-time nature and the session outcome, which is valuable for an agent calling this tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that front-loads the core action ('Exchange a 6-digit Client Portal sign-in PIN for a session') and appends the usage context and single-use caveat. There is no fluff or redundant wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter, no-output-schema tool, the description adequately conveys what it does, when to use it, and key behavioral constraints. It does not specify error handling or the exact session object returned, but given the simplicity and annotations, these are minor omissions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: only email has a schema description ('The address the PIN was sent to.'). The pin parameter only has a pattern, but the tool description clarifies pin as a '6-digit Client Portal sign-in PIN', adding meaning beyond the schema. Thus both parameters are effectively covered via schema and description, exceeding the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Exchange'), resource ('6-digit Client Portal sign-in PIN'), and outcome ('for a session'), and distinguishes itself by noting 'for practices that email a code instead of a link', which clearly differentiates it from the sibling verify_sign_in_token that handles link-based authentication.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly gives the usage context: 'for practices that email a code instead of a link' and notes 'Single-use'. This tells the agent when to use this tool (email-code-based sign-in) and implies not to use it for link-based flows. However, it does not explicitly name the alternative tool (e.g., verify_sign_in_token), so the guidance is clear but not fully explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simplepractice_verify_sign_in_tokenA

Exchange an emailed sign-in link (or the token in it) for a Client Portal session. Accepts the whole link or just the part after the "#". Prefer passing the WHOLE link: its address names the practice, so no practice has to be configured, and this server remembers it afterwards. Tokens are single-use and last 24 hours.

ParametersJSON Schema
NameRequiredDescriptionDefault
linkYesThe sign-in link from the email, or just the token after the "#".

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations only say readOnly=false and idempotent=false. The description adds valuable non-obvious behavior: tokens are single-use, last 24 hours, and the server remembers the practice from the full link. This is precisely the kind of context an agent needs before calling a session-exchange tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three focused sentences: core action first, then input forms, then preference with rationale. Every sentence earns its place, with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter auth exchange tool with no output schema, the description covers input format, preference, token lifecycle, and expected outcome—'Client Portal session.' Nothing needed to correctly select and invoke the tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only describes the parameter as the sign-in link or token after '#'. The description enriches this substantially by explaining how to format the input, why the whole link is preferred, and what happens when each form is used.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Exchange an emailed sign-in link ... for a Client Portal session.' It also clarifies the acceptable input forms, making it easy to distinguish from sibling tools like simplepractice_verify_sign_in_pin.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context: this tool is for emailed sign-in links or tokens, and it explicitly advises preferring the whole link because it avoids needing a configured practice. It does not explicitly name alternatives like verify_sign_in_pin, but the intended use case is unambiguous.

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.

  1. 5 tool updatesv0.4.1
    • Changedsimplepractice_get_billing_overview1 field changed
      • addedInput schema / properties / view
        Added value: +{
        +  "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact returns the slim projection where one exists and strips image URLs elsewhere; \"full\" returns SimplePractice's whole records.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedsimplepractice_get_document_request1 field changed
      • addedInput schema / properties / view
        Added value: +{
        +  "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact returns the slim projection where one exists and strips image URLs elsewhere; \"full\" returns SimplePractice's whole records.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedsimplepractice_list_announcements1 field changed
      • addedInput schema / properties / view
        Added value: +{
        +  "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact returns the slim projection where one exists and strips image URLs elsewhere; \"full\" returns SimplePractice's whole records.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedsimplepractice_list_appointments2 fields changed
      • removedInput schema / properties / compact
        Removed value: -{
        -  "default": true,
        -  "description": "Return a slim projection. Set false for the full records.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / view
        Added value: +{
        +  "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact returns the slim projection where one exists and strips image URLs elsewhere; \"full\" returns SimplePractice's whole records.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
    • Changedsimplepractice_list_billing_items1 field changed
      • addedInput schema / properties / view
        Added value: +{
        +  "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact returns the slim projection where one exists and strips image URLs elsewhere; \"full\" returns SimplePractice's whole records.",
        +  "enum": [
        +    "compact",
        +    "full"
        +  ],
        +  "type": "string"
        +}
  2. 2 tool updatesv0.3.0
    • Addedsimplepractice_healthcheck
    • Changedsimplepractice_request_sign_in_link1 field changed
      • addedInput schema / properties / practice
        Added value: +{
        +  "description": "The practice whose portal to sign in to — the slug (\"achievebalancetherapy\"), the host, or the portal URL. Only needed when this server does not know the practice yet; signing in with an emailed link teaches it, and it then remembers.",
        +  "minLength": 1,
        +  "type": "string"
        +}
  3. 14 tool updatesv0.1.0
    • First observedsimplepractice_get_account
    • First observedsimplepractice_get_billing_overview
    • First observedsimplepractice_get_document_request
    • First observedsimplepractice_list_announcements
    • First observedsimplepractice_list_appointments
    • First observedsimplepractice_list_billing_items
    • First observedsimplepractice_list_document_requests
    • First observedsimplepractice_list_documents
    • First observedsimplepractice_list_payment_methods
    • First observedsimplepractice_request_sign_in_link
    • First observedsimplepractice_session_status
    • First observedsimplepractice_sign_out
    • First observedsimplepractice_verify_sign_in_pin
    • First observedsimplepractice_verify_sign_in_token

TDQS

A3.8/5.0
Disambiguation5/5

Each tool targets a distinct action or resource: auth, account, appointments, billing, documents, announcements, and healthcheck. Even the sign-in variants (link/token/pin) are clearly separated by description, and list_billing_items vs get_billing_overview serve different purposes.

Naming Consistency4/5

The simplepractice_ prefix and consistent snake_case make the set cohesive, and most tools follow list_/get_/verify_/request_ verb patterns. A couple of exceptions like session_status and healthcheck are noun-like rather than verb_noun, so it is not perfectly uniform.

Tool Count5/5

15 tools is within the ideal range and every tool earns its place: five cover the auth lifecycle, one checks connectivity, and the rest cover distinct client-portal read surfaces. The count is well-scoped for a purpose-built integration.

Completeness3/5

The auth lifecycle and read-only views are thorough, but there are notable dead ends: document requests can be listed and viewed yet not submitted, billing can be viewed yet not paid, and appointments can be listed yet not changed. An agent can answer many questions, but a client trying to act on those items would hit a gap.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

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

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Enables Claude to read appointments, invoices, quotes, and work requests from a Jobber Client Hub. Read-only, uses a local browser bridge to access the customer portal.
    7
    344
    MIT
  • F
    license
    A
    quality
    C
    maintenance
    Enables read-only access to a Librus Portal account, letting users list linked Synergia accounts and retrieve grades, attendance, timetable, homework, notices, and school information.
    3
    -

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/chrischall/simplepractice-mcp'

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