healow-mcp-server
Server Quality Checklist
Latest release: v0.1.0
- Disambiguation4/5
Most tools are clearly distinct by resource type (e.g., search_encounter vs. search_condition). The generic fhir_get/fhir_search overlap with specific wrappers, but descriptions clarify their broad vs. focused nature. A few potential confusions exist (e.g., list_allergies vs. search_condition), but overall boundaries are clear.
Naming Consistency3/5Tool names are all snake_case but mix verb styles: get_ (get_patient), search_ (search_encounter), list_ (list_allergies), fhir_ (fhir_get), plus standalone names (whoami, connect_practice). This inconsistent verb choice across similar operations (e.g., search_observation vs. list_immunizations) makes the pattern less predictable.
Tool Count4/520 tools is reasonable for a FHIR server covering authentication, generic FHIR operations, and a broad set of clinical resource types. While slightly on the higher side, each tool serves a distinct resource or workflow, and the count matches the domain complexity.
Completeness4/5The toolset covers core FHIR resources (Patient, Encounter, Observation, Condition, MedicationRequest, etc.) with both list and search capabilities. Missing common resources like DiagnosticReport or Procedure can be accessed via generic fhir_search, so agents can work around gaps. The read-only scope is consistent with the OAuth launch context.
Average 3.6/5 across 20 of 20 tools scored. Lowest: 2.9/5.
See the Tool Scores section below for per-tool breakdowns.
- 0 of 3 community issues answered or closed in the last 6 months
- 1 commit in the last 12 weeks
- No stable releases found
- No critical vulnerability alerts
- No high-severity vulnerability alerts
- No code scanning findings
- CI status not available
Add a LICENSE file by following GitHub's guide. Once GitHub recognizes the license, the system will automatically detect it within a few hours.
If the license does not appear after some time, you can manually trigger a new scan using the MCP server admin interface.
MCP servers without a LICENSE cannot be installed.
This repository includes a README.md file.
No tool usage detected in the last 30 days. Usage tracking helps demonstrate server value.
Tip: use the "Try in Browser" feature on the server page to seed initial usage.
Add a glama.json file to provide metadata about your server.
If you are the author, simply .
If the server belongs to an organization, first add
glama.jsonto the root of your repository:{ "$schema": "https://glama.ai/mcp/schemas/server.json", "maintainers": [ "your-github-username" ] }Then . Browse examples.
Add related servers to improve discoverability.
How to sync the server with GitHub?
Servers are automatically synced at least once per day, but you can also sync manually at any time to instantly update the server profile.
To manually sync the server, click the "Sync Server" button in the MCP server admin interface.
How is the quality score calculated?
The overall quality score combines two components: Tool Definition Quality (70%) and Server Coherence (30%).
Tool Definition Quality measures how well each tool describes itself to AI agents. Every tool is scored 1–5 across six dimensions: Purpose Clarity (25%), Usage Guidelines (20%), Behavioral Transparency (20%), Parameter Semantics (15%), Conciseness & Structure (10%), and Contextual Completeness (10%). The server-level definition quality score is calculated as 60% mean TDQS + 40% minimum TDQS, so a single poorly described tool pulls the score down.
Server Coherence evaluates how well the tools work together as a set, scoring four dimensions equally: Disambiguation (can agents tell tools apart?), Naming Consistency, Tool Count Appropriateness, and Completeness (are there gaps in the tool surface?).
Tiers are derived from the overall score: A (≥3.5), B (≥3.0), C (≥2.0), D (≥1.0), F (<1.0). B and above is considered passing.
Tool Scores
- Behavior2/5
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description must carry the full transparency burden. It does not disclose any behavioral traits beyond the action itself, such as return format, pagination, filtering details, or what happens when no allergies are found. 'List' implies a read operation, but no safety or side-effect context is provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Conciseness5/5Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler or redundant information. It is front-loaded with the primary action and resource, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Completeness2/5Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values do not need to be explained. However, the description is incomplete for a tool with an unexplained required parameter and no usage guidance. The phrase 'launch patient' is ambiguous without context, and the role of 'practice' is entirely omitted, leaving the description insufficient for a complete understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Parameters1/5Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has one required parameter, 'practice', with 0% schema description coverage. The description does not mention or explain this parameter at all, leaving a critical gap. The agent cannot infer what 'practice' means or how it affects the listing from the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Purpose5/5Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly and specifically states the action ('List'), the resource type ('AllergyIntolerance'), and the scope ('for the launch patient'). It distinguishes itself from sibling tools like list_immunizations and list_problems by naming the exact FHIR resource and patient context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Usage Guidelines2/5Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as fhir_search or other list tools. There is no explicit mention of when not to use it or how it differs from searching AllergyIntolerance resources. The phrase 'for the launch patient' implies a context but does not offer exclusions or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
- Behavior2/5
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does not mention what happens when no patient is in context, whether it can return null, authorization requirements, or any side effects. The description is too terse to provide meaningful transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Conciseness5/5Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no unnecessary words. It is appropriately sized for a simple getter tool and front-loads the core action ('Get the patient').
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Completeness2/5Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description lacks critical context about the launch context concept, what 'practice' refers to, and error/edge-case behavior. For a tool with one required parameter and a specific FHIR context, the description is insufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Parameters1/5Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description does not explain the 'practice' parameter beyond the schema's title. The description's phrase 'for a practice' does not clarify the parameter's meaning, format, or acceptable values. The description fails to compensate for the lack of schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Purpose5/5Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('patient'), and clarifies the scope ('in the launch context for a practice'), which clearly distinguishes it from sibling tools like get_practitioner or get_coverage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Usage Guidelines3/5Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'in the launch context' implies a specific use case (retrieving the current patient in a SMART on FHIR session), but no explicit guidance is given about when to use this versus alternatives like fhir_get or search_encounter. It provides some context but lacks exclusions or alternative mentions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
- Behavior2/5
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only states 'Read' without revealing authentication needs, error behavior, or response format, leaving the agent without critical safety/contextual information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Conciseness4/5Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no wasted words. It is appropriately concise for a simple read, though it omits an explanation of the second parameter, making it slightly sparse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Completeness3/5Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward read operation with an output schema, the description covers the core action but leaves the 'practice' parameter unexplained. This creates a gap in operational completeness, especially given the sibling tools that might require context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Parameters2/5Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description only mentions 'id', ignoring the 'practice' parameter entirely. It adds minimal meaning beyond the schema, failing to explain the purpose or relationship of 'practice'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Purpose5/5Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Read' plus the resource 'Practitioner' and scope 'by id', clearly distinguishing it from siblings like get_patient or fhir_get. It precisely states the tool's function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Usage Guidelines2/5Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like fhir_get or how it relates to the practice context. There are no mentions of prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
- Behavior3/5
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden for behavioral disclosure. 'List' implies a read-only operation, and the launch patient scope adds context, but there is no information about authentication, pagination, or other behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Conciseness5/5Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear, front-loaded sentence with no unnecessary words. It efficiently conveys the core purpose without wasting space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Completeness2/5Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description leaves a required parameter unexplained and lacks usage context. The tool is simple, but the missing parameter semantics make the description incomplete for an agent to use it effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Parameters1/5Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, and the description does not mention the required 'practice' parameter at all. The agent has no information about what value to provide for this parameter, making the tool difficult to invoke correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Purpose5/5Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists Immunization resources for the launch patient, specifying the verb (list), resource (Immunization), and scope (launch patient). This distinguishes it from sibling tools like list_allergies or list_problems.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Usage Guidelines3/5Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is given on when to use this tool versus alternatives like fhir_search or other list_* tools. The scope 'for the launch patient' implies its use when patient immunizations are needed, but no exclusions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
- Behavior3/5
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the burden. It implies a read-only operation via 'List' but does not disclose pagination, authorization, or any side effects. It is not misleading but adds minimal behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Conciseness5/5Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no redundancy, earning high marks for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Completeness2/5Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite the low complexity, the description leaves key gaps: it doesn't explain the required 'practice' parameter, how 'launch patient' is derived, or how this differs from search_condition. The existing output schema may compensate but is not referenced.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Parameters1/5Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description does not mention the 'practice' parameter at all, and the schema only provides the name and type. With 0% description coverage, the agent has no guidance on what value to provide or why it's required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Purpose5/5Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('problem-list Conditions') with a context ('for the launch patient'), clearly distinguishing it from sibling tools like list_allergies and search_condition.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Usage Guidelines3/5Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving a patient's problem list but does not mention alternatives or exclusions, leaving the agent to infer when to use this over search_condition or other list tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
- Behavior2/5
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description only states that it returns claims. It does not disclose the structure of the claims, error behavior when no practice is connected, or safety profile. The term 'id_token claims' gives some indication but not enough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Conciseness5/5Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that immediately states the action and target, with no superfluous wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Completeness2/5Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, but with no output schema and an ambiguous parameter, the description leaves gaps in understanding the exact return format and how to specify the practice. Given the context of FHIR tooling, more detail would be helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Parameters2/5Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single required parameter 'practice' has no schema description, and the description does not clarify what value should be passed (e.g., practice ID, API key). The phrase 'for a connected practice' hints at the context but does not define the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Purpose5/5Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Return' with the resource 'id_token claims' and scope 'connected practice', clearly distinguishing it from sibling tools like connect_practice and list_practices.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Usage Guidelines3/5Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage after a practice is connected, but does not explicitly state when to use this tool over others or mention any exclusions. It could benefit from a reference to connect_practice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
- Behavior3/5
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. 'Fetch' clearly signals a read-only operation and the endpoint adds context, but it does not disclose auth requirements, rate limits, or potential side effects. This is adequate for a simple read but lacks richer behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Conciseness5/5Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that directly conveys the tool's purpose and endpoint. Every word earns its place, and there is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Completeness3/5Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool, the description gives the core purpose and endpoint, but it omits the meaning of the required 'practice' parameter and provides no usage alternatives. Since there is no output schema, it also does not describe the return format, though 'Fetch CapabilityStatement' implies the response. Overall, it is minimally adequate with notable gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Parameters2/5Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has one required parameter 'practice' with no description, and schema coverage is 0%. The description does not explicitly explain how 'practice' maps to the {base} in the endpoint, leaving the parameter's meaning largely unexplained. It provides only a marginal hint via the endpoint template.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Purpose5/5Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches the server CapabilityStatement, with the explicit endpoint ({base}/metadata). This is a specific verb and resource that distinguishes it from sibling tools like fhir_get or fhir_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Usage Guidelines2/5Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no guidance on when to use this tool versus alternatives, nor does it mention exclusions or prerequisites. It simply states what the tool does, 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.
- Behavior3/5
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the return values (authorize_url, state) and the need for a follow-up, but omits side effects, user interaction requirements, and state expiration details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Conciseness5/5Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the primary action, and no unnecessary words. It efficiently conveys the action, the return value, and the next step.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Completeness3/5Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the essential flow (initiate and complete), but lacks parameter meanings and any user interaction expectations. For a simple two-param tool, it's adequate but incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Parameters1/5Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain 'name' or 'fhir_base_url'. The agent is left without any guidance on what values to provide, despite the tool having only two parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Purpose5/5Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it begins connecting a practice and returns an authorize_url and state, distinguishing it from the sibling completion tool (complete_oauth). The verb 'begin' is specific, and the resource is a practice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Usage Guidelines4/5Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this tool to start the connection and then use complete_oauth to finish, providing clear context and a named next step. It doesn't explicitly mention when not to use it, but the companion tool reference is sufficient for most cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
- Behavior3/5
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It explicitly states this is a read operation and returns the raw resource, which is good basic transparency. However, it does not disclose error behavior, authentication needs, or practice scoping.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Conciseness5/5Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that wastes no words. It directly states the action, scope, and return value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Completeness3/5Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the basic purpose and return format but omits the meaning of the 'practice' parameter and any error/edge-case behavior. Since there is no output schema and no annotations, these omissions leave the tool only minimally contextualized.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Parameters2/5Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains that 'resource' means the resource type and 'id' is the resource id, but it does not explain the required 'practice' parameter at all. This is a significant gap for a 3-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Purpose5/5Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads any FHIR resource by type and id and returns the raw resource. This specific verb+resource+scope distinguishes it from sibling tools like fhir_search or specific get_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Usage Guidelines3/5Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for reading a known resource by type and id, but it does not explicitly provide when-not-to-use guidance or mention alternatives like fhir_search for querying. The context is clear but no exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
- Behavior3/5
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It does reveal the response structure, which is a key trait, but it does not mention error behavior, authentication, or side effects. 'Fetch' implies read-only, and the return format adds value, but other traits are absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Conciseness5/5Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with no extraneous content. It is front-loaded with the action and resource, and the response format is appended concisely.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Completeness3/5Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple fetch tool, it provides the action and return format, which covers the core need. However, with no annotations and no output schema, the description falls short by not explaining the 'practice' parameter or any context around its usage. The tool is simple, but the missing parameter explanation prevents a higher score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Parameters2/5Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no parameter descriptions (0% coverage), so the description must compensate. It implicitly clarifies the 'id' parameter as the Binary identifier, but the 'practice' parameter is left unexplained. This is incomplete for a two-parameter tool with no other documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Purpose5/5Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the action (Fetch), the resource (Binary by id), and the response format ({content_type, data_base64}). This distinguishes it from sibling get tools like get_patient or get_coverage, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Usage Guidelines3/5Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when a Binary resource is needed by id, but it does not provide explicit when-to-use or alternative guidance compared to siblings. The simple 'Fetch a Binary by id' gives clear context, but no exclusions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
- Behavior2/5
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It simply says 'Read', which is a safe operation, but it doesn't disclose error behavior (e.g., not found), required permissions, or any other behavioral traits. The description adds little beyond what the tool name already implies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Conciseness5/5Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, directly to the point, and front-loaded with the main action. Every word earns its place, and there is no unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Completeness3/5Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The presence of an output schema means return values are already documented. The description covers the core purpose of fetching a Coverage by id, but it omits any explanation of the practice parameter, which is required and not self-explanatory. This is a notable gap for a simple two-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Parameters2/5Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has two required parameters, id and practice, with zero description coverage. The description mentions 'by id', which clarifies that id is the identifier, but it does not explain the purpose or role of the practice parameter. This leaves a critical parameter ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Purpose5/5Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Read a Coverage resource by id' clearly states the action (read), the specific resource (Coverage), and the selection method (by id). It distinguishes itself from sibling tools like get_patient or get_practitioner by targeting the Coverage resource specifically.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Usage Guidelines4/5Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a clear usage: fetch a single Coverage by its id. However, it does not explicitly mention alternatives or exclusions, such as when to use fhir_search instead. This is clear context without explicit alternatives, so a 4 is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
- Behavior3/5
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry behavioral disclosure. 'List' implies a safe, read-only operation, and 'for the launch patient' adds scoping, but it does not mention pagination, result ordering, filtering, or any edge-case behavior. This is adequate for a simple list 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/5Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence with no filler. It communicates the core purpose and scope efficiently, making it easy for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Completeness3/5Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple list tool with an output schema, so return-value structure is likely covered elsewhere. However, the unexplained `practice` parameter and lack of any relationship between practice and the launch patient are notable gaps that prevent the description from being fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Parameters1/5Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has one required parameter, `practice`, at 0% schema description coverage. The description does not mention or explain `practice` at all, leaving the agent to guess what value to provide and how it relates to the 'launch patient'. The description fails to compensate for the missing parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Purpose5/5Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List'), the resource ('CarePlan resources'), and the scope ('for the launch patient'). This distinguishes it from sibling list_* tools that target other resource types, so an agent can immediately tell when this tool is relevant.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Usage Guidelines4/5Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool: when the launch patient's CarePlan resources are needed. It does not explicitly name alternatives or exclusions, but the scope is specific enough to guide selection among the many sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
- Behavior2/5
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral burden. It only states the action ('Search Observations') without disclosing whether it is read-only, pagination behavior, required authentication context, or any other runtime semantics. This is a significant gap for an unannotated 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/5Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundancy. It conveys the core purpose and category options efficiently, earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Completeness3/5Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, return values are covered. The description states the scope and category filter, which is adequate for a simple search tool. However, it leaves gaps around parameter semantics and behavioral details, making it minimally viable but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Parameters2/5Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%. The description only hints at the 'category' parameter by listing its allowed values (laboratory, vital-signs, etc.) but provides no explanation for the required 'practice' parameter or the optional 'code' and 'date' parameters. It does not compensate for the schema's lack of descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Purpose5/5Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Search' + resource 'Observations' with a specific scope ('for the launch patient') and a distinguishing filter ('by USCDI category'). It is specific enough to differentiate from sibling tools like search_encounter or search_condition.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Usage Guidelines4/5Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the tool (for the launch patient's observations, filtered by USCDI category). However, it does not explicitly name alternatives or exclusions (e.g., when to use fhir_search instead), so it stops short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
- Behavior3/5
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden for transparency. 'Search' implies a read-only operation, and 'for the launch patient' adds scope, but it lacks details on pagination, authorization, or constraints beyond status/date filters. It 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/5Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loading the core purpose and omitting unnecessary words. It is efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Completeness2/5Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although an output schema exists, the description remains incomplete for a 3-parameter tool: it fails to explain the required 'practice' parameter and gives no guidance on pagination or relation to other search tools. The missing required parameter is a notable contextual gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Parameters2/5Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description mentions 'status/date filters', clarifying the optional parameters, but it completely omits the required 'practice' parameter, which is critical for the tool to function. With 0% schema coverage from the description, this is a significant gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Purpose5/5Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches for Encounters, scoped to the launch patient, which distinguishes it from sibling tools that search other FHIR resources. The verb 'Search' and resource 'Encounters' make the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Usage Guidelines4/5Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool (searching encounters for the launch patient) and mentions optional filters, but it does not explicitly exclude alternatives or name when to prefer generic fhir_search over this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
- Behavior3/5
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of explaining behavior. It states the patient scope and optional status filter, and 'Search' implies a non-mutating operation. However, it omits authorization needs, potential pagination, and any limitations—serviceable but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Conciseness5/5Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, front-loaded with the core purpose, and contains no redundant or filler content. It earns every word.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Completeness2/5Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Though the tool is simple, the description leaves the required 'practice' parameter entirely unexplained and does not mention what the returned resources look like. The presence of an output schema helps, but the lack of annotation coverage and opaque required parameter make this incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Parameters2/5Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the parameters. It only mentions the optional status filter but does not describe valid status values or the required 'practice' parameter, leaving a critical parameter unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Purpose5/5Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Search'), identifies the exact resource ('MedicationRequests'), and clarifies the scope ('for the launch patient'), which clearly distinguishes it from generic fhir_search and sibling resource-specific searches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Usage Guidelines4/5Does the description explain when to use this tool, when not to, or what alternatives exist?
It communicates when to use the tool: when you need medication requests for the launch patient. It does not explicitly exclude alternatives like fhir_search, but the patient-scoped context is clear enough for an agent to make a reasonable selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
- Behavior2/5
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It describes the exchange and return values, and mentions validating state, but does not disclose side effects (e.g., token storage, session changes), failure modes, or security implications. This is significant for a mutation-like OAuth 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/5Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action, and contains no extraneous information. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Completeness4/5Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a standard OAuth exchange step, and the description covers the main action and return information. It lacks details on error scenarios or how tokens are handled, but given the simplicity and the context provided by sibling tools, it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Parameters3/5Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description compensates partially by referring to 'an authorization code (and its state)', which maps to both code and state parameters. However, it does not elaborate on the expected format, source, or purpose of state (e.g., CSRF protection), leaving gaps for an agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Purpose5/5Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb ('Exchange') and resource ('authorization code') for tokens, and explicitly mentions the return value (practice name and patient context). This distinguishes it from sibling tools like connect_practice and whoami, which serve different purposes in the OAuth flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Usage Guidelines4/5Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies its usage context: it should be used when you have an authorization code to exchange for tokens. It does not mention alternatives or when not to use it, but the OAuth flow context is clear and no misleading guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
- Behavior3/5
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description indicates a read-only operation via the verb 'search' and specifies that it operates on the launch patient, which is a behavioral constraint. It also lists valid category values. However, with no annotations, it does not elaborate on safety, pagination, or potential side effects, leaving some traits implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Conciseness5/5Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only two sentences, with no redundant words. It front-loads the core purpose and then adds the optional filter. This is an excellent example of concise writing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Completeness4/5Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool, the description covers the purpose and one parameter's semantics. An output schema exists to define return values, so the description does not need to cover those. The missing practice explanation is the main gap, but overall it is fairly complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Parameters3/5Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description provides allowed values for the category parameter, adding value beyond the bare schema. However, it does not explain the practice parameter, which is required, leaving a significant gap given 0% schema coverage. It partially compensates but misses one of two parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Purpose5/5Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches Conditions for the launch patient, using a specific verb and resource. It distinguishes from sibling tools like search_encounter and fhir_search by specifying the resource and scope. The optional category filter is also mentioned, adding further clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Usage Guidelines3/5Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case: searching conditions for the currently launched patient. However, it does not explicitly contrast with fhir_search or list_problems, nor does it state when not to use this tool. It provides context but lacks explicit guidance on alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
- Behavior4/5
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses key behavioral details: it returns a raw Bundle (first page only) and instructs to follow Bundle.link[next] for pagination. This goes beyond the schema and gives the agent a realistic expectation of the output. It does not mention auth or error handling, but for a search operation this is relatively transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Conciseness5/5Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, with the core action front-loaded ('Search any FHIR resource type') and a concise, valuable note about the response format and pagination. There is zero filler, making it highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Completeness3/5Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core purpose, return type, and pagination, but it lacks crucial guidance on parameter construction and prerequisites like a connected practice. For a generic search tool with three params and no output schema, the missing param semantics leaves the agent under-informed, making it only somewhat complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Parameters2/5Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no descriptions for practice, resource, or params, and the description provides minimal additional meaning. 'Arbitrary query params' is vague; it doesn't explain how to structure the params object (e.g., key-value FHIR search parameters), what resource values are valid, or how practice is used. With 0% schema coverage, this is a significant gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Purpose5/5Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb and resource: 'Search any FHIR resource type with arbitrary query params.' It distinguishes itself from sibling tools by covering all resource types generically, unlike specialized search tools like search_encounter or fhir_get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Usage Guidelines4/5Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a generic usage applicable to any FHIR resource, which indicates when to use this tool over specialized alternatives. It also provides pagination guidance ('follow Bundle.link[next] for more'), offering clear context. However, it does not explicitly exclude cases where specialized search tools should be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
- Behavior4/5
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. 'Read' implies a non-mutating operation, and 'content URLs fetchable via get_binary' discloses an important behavioral relationship. It stops short of describing error handling or auth requirements, but for a simple read tool this is reasonable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Conciseness5/5Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with a useful parenthetical. Every word contributes meaning, and there is no repetition of the tool name or schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Completeness4/5Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-by-id tool with an output schema, the description covers the core operation and cross-links to get_binary. It is slightly incomplete only in the undefined 'practice' parameter and lack of edge-case behavior, but overall it is sufficient for the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Parameters2/5Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for parameter meaning. It clarifies 'id' with 'by id', but does not explain the 'practice' parameter or how it relates to the lookup. The agent must infer from the parameter name alone, which is insufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Purpose5/5Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Read' and identifies the exact resource (DocumentReference) and lookup key (id), clearly distinguishing it from sibling tools like get_binary or fhir_get. The parenthetical about content URLs adds useful context without obscuring the core purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Usage Guidelines4/5Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context by pointing to get_binary for fetching content URLs, but doesn't explicitly state when to prefer this tool over fhir_get or list exclusions. For a simple read-by-id tool, this is adequate and helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
- Behavior3/5
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must stand alone. It discloses the operation (list) and the output fields, but doesn't explicitly state it's a read-only operation with no side effects, nor does it mention any prerequisites like OAuth state. Basic transparency but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Conciseness5/5Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with the action and includes the key output fields. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Completeness4/5Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool, the description adequately covers purpose and outputs. An output schema exists to define the return structure, so the description doesn't need to detail it. It could add a note about empty lists or ordering, but not essential.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Parameters4/5Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters; the empty schema is fully self-documenting, so no additional parameter explanation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Purpose5/5Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'List' with the resource 'connected practices' and enumerates the returned fields (FHIR base URL, patient id, connection time), clearly distinguishing it from sibling tools like connect_practice or get_practitioner.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Usage Guidelines4/5Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context that this is for viewing existing practice connections, implying use when you need to see connected practices. It doesn't name alternatives or exclusions, but the purpose is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
GitHub Badge
Glama performs regular codebase and documentation scans to:
- Confirm that the MCP server is working as expected.
- Confirm that there are no obvious security issues.
- Evaluate tool definition quality.
Our badge communicates server capabilities, safety, and installation instructions.
Card Badge
Copy to your README.md:
Score Badge
Copy to your README.md:
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/Voysi-IA/healow-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server