Skip to main content
Glama

Server Details

Public directory of UK medical cannabis clinics, pharmacies, products and strains.

Ownership verified
Status
Healthy
Uptime
94.5% over 45 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
Findabis/MCP
GitHub Stars
0

TDQS

A4.4/5.0

Scored across 9 tools

Disambiguation4/5

Each entity type gets its own find_* tool, get_product is explicitly carved out from get_listing, and search_findabis is framed as a slug-resolution/discovery step before the specific tools. The only soft spots are get_listing acting as a multi-kind aggregator and the potential confusion between searching a medicine versus its brand or strain, but the descriptions pre-empt both by cross-referencing the right tool.

Naming Consistency4/5

The set is dominated by a clean verb_noun pattern (find_brands, find_clinics, find_pharmacies, find_products, find_strains, get_listing, get_product, compare_providers). search_findabis breaks the pattern by embedding the server name instead of an object noun, which is the only notable deviation.

Tool Count5/5

Nine tools map cleanly onto the domain's five entity types plus detail lookup, comparison and cross-kind search, with no redundancy. Every tool earns its place and the surface stays well within a comfortable range.

Completeness4/5

Discovery, detail retrieval, comparison and cross-entity search give near-full lifecycle coverage, and the documented access limits (stock, per-pharmacy prices) are scope decisions rather than gaps. The main shortfall is that compare_providers only handles clinics and pharmacies, so brands, strains and products have no side-by-side operation.

Available Tools

9 tools
compare_providersCompare clinics or pharmaciesA
Read-onlyIdempotent
Inspect

Two to six clinics, or two to six pharmacies, side by side by slug. Clinics: first and follow-up fees, estimated year-one and later-year clinic fees with a line-by-line breakdown for the patient type and visit counts you give, consultation types, CQC rating, reviews and whether accepting patients. Pharmacies: delivery and its cheapest price, free-delivery threshold, collection, GPhC registration and inspection outcome, reviews. Use it for 'which is cheapest', 'what's the difference between'. Services only: it never compares medicines or medicine prices, and the figures are each provider's published ones.

NameRequiredDescriptionDefault
kindYesCompare clinics or pharmacies (not both at once).
slugsYes2-6 page slugs from find_clinics / find_pharmacies.
patientTypeNoClinics: price year one as NEW_PATIENT (default), TRANSFER or ACTIVE_PATIENT.
followUpsPerYearNoClinics: follow-up consultations a year. Default 4.
prescriptionsPerYearNoClinics: repeat prescriptions a year. Default 12.

Output Schema

NameRequiredDescription
kindYes
noteYes
clinicsNo
missingYesSlugs with no such listing
pharmaciesNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, so safety is covered; the description adds real value on top by disclosing data provenance ('the figures are each provider's published ones') and the scope limit that only services, never medicines, are compared. It does not discuss latency or result completeness, so 4 rather than 5.

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?

Dense but well ordered: comparison targets first, then clinic attributes, then pharmacy attributes, then use cases, then boundaries. It slightly over-enumerates return fields that a separate output schema already covers, which is the only inefficiency.

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 dual-mode tool with 5 parameters and an output schema, the description covers the mode switch, the 2-6 slug constraint, mode-specific inputs, comparison dimensions, and data provenance. Since an output schema exists, it is not obligated to describe return shape further, and nothing an agent needs to call it correctly is missing.

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 100%, so the baseline is 3, but the description adds meaning the schema does not: it ties patientType/followUpsPerYear/prescriptionsPerYear to a computed 'line-by-line breakdown for the patient type and visit counts you give' and marks these as clinic-only inputs. Slug semantics are left to the schema.

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?

States a specific verb (compare) and resource (clinics or pharmacies) with cardinality and keying method ('two to six ... side by side by slug'). It also enumerates exactly which attributes are compared per provider type, so an agent can distinguish it from find_clinics/find_pharmacies without opening the schema.

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?

Gives concrete user-intent triggers ('which is cheapest', 'what's the difference between') and an explicit when-not boundary ('it never compares medicines or medicine prices'), plus the constraint that clinic and pharmacy cannot be mixed. It does not name sibling tools as alternatives or say when to prefer two get_listing calls over this, so it falls short of a full 5.

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

find_brandsFind medical cannabis brandsA
Read-onlyIdempotent
Inspect

Find the brands (makers) of cannabis-based medicines listed on Findabis, by name or by the dose forms they make. Returns up to 25 brands at a time (page on with offset) with slug, page URL, town and country, website, and how many of their products Findabis lists — a count, never stock or which pharmacies hold them. Sorted by name or by product count, never by sponsorship. A listing is not an endorsement. For one brand in full, use get_listing with kind "brand"; for its products, find_products with the brand name as query.

NameRequiredDescriptionDefault
sortNoname_asc (default), name_desc, or products_desc (most listed products first).
limitNoHow many to return, 1-25. Default 10.
queryNoBrand name, matched as text. Omit to browse.
offsetNoSkip this many results, for the next page (the answer says which offset comes next). Default 0.
categoryNoOnly brands with a listed product in this dose form. CARTRIDGE is a vape cartridge.

Output Schema

NameRequiredDescription
noteNo
totalYesHow many matched in all; narrow the query when this exceeds the results
resultsYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description goes well beyond: the 25-per-page cap and offset paging, that the product figure is a count and never stock or pharmacy holdings, that sorting is never sponsorship-driven, and that a listing is not an endorsement. These are non-obvious behavioral and semantic constraints an agent could not infer from structured fields.

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?

Front-loads purpose, then return shape, then caveats, then sibling routing — a logical order with no filler. It is dense and slightly long, packing paging, ranking and disclaimer into one block, but nearly every clause carries distinct information.

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?

Despite an output schema existing, the description still names the returned fields (slug, URL, town/country, website, product count), plus paging and ranking semantics. For a 5-parameter zero-required search tool, nothing an agent needs to invoke it correctly is missing.

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 100%, so the baseline is 3, but the description adds real meaning: it frames `offset` as the paging mechanism returning the next offset, and characterizes `category` as 'the dose forms they make'. It does not re-explain `limit` or `sort` enums, so it stops short of the schema's full detail.

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?

Opens with a specific verb and resource ('Find the brands (makers) of cannabis-based medicines'), clarifies the search axes (name or dose form), and explicitly distinguishes itself from get_listing and find_products. An agent can identify the tool's niche among the nine siblings without opening the schema.

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

Usage Guidelines5/5

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

Explicitly routes: use get_listing with kind "brand" for one brand in full, and find_products with the brand name as `query` for its products. It also implies the browse case via the schema ('omit query to browse') and the pagination continuation. When-to-use and when-not-to-use are both covered.

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

find_clinicsFind medical cannabis clinicsA
Read-onlyIdempotent
Inspect

Find UK clinics that can prescribe cannabis-based medicines. Use near (postcode or town) for 'near me' questions: nearest first, with miles. Filter by the conditions a clinic's published policy lists, consultation type (online, in person, phone), CQC rating, first-consultation fee, accepting patients and patient type; sort by distance, year-one clinic fees or rating. Returns up to 25 clinics at a time (page on with offset), each with slug, page URL, town, distance, first and follow-up fees, estimated year-one clinic fees (never medicine), consultation types, CQC rating, review score and which patient types it takes. A listed condition is the clinic's referral scope, not a statement that anyone qualifies: only a specialist decides that. It does not return doctors or appointment availability. For one clinic in full, use get_listing; to weigh several, compare_providers.

NameRequiredDescriptionDefault
cqcNoCQC rating filter; GOOD_OR_BETTER keeps Good and Outstanding.
nearNoA UK postcode, outcode or town, e.g. "M1 1AE", "LS6" or "Bristol". Sorts nearest first and adds miles.
sortNodistance (default with `near`), az (default otherwise), za, cheapest / dearest by year-one clinic fees, rating.
limitNoHow many to return, 1-25. Default 10.
queryNoClinic name, matched as text. For a place use `near`.
offsetNoSkip this many results, for the next page (the answer says which offset comes next). Default 0.
conditionNoOnly clinics whose published policy lists this condition. One of: Anxiety / Depression; PTSD; Insomnia / Sleep disorders; Chronic pain; Neuropathic pain; Multiple Sclerosis / Spasticity; Cancer symptoms; IBD (Crohn's / Ulcerative Colitis); Migraine; Arthritis / inflammatory pain; ADHD / Autism spectrum symptoms; Endometriosis / women's health symptoms. A listed condition is the clinic's referral scope, never a statement that anyone qualifies.
patientTypeNoNEW_PATIENT, TRANSFER or ACTIVE_PATIENT. Drops clinics whose policy does not take it, and prices year one for that route.
radiusMilesNoOnly within this many miles of `near`. Ignored without `near`.
consultationTypeNoOnly clinics offering ONLINE (video), IN_PERSON or PHONE.
acceptingPatientsNoOnly clinics showing 'Accepting patients' (an active published policy).
maxFirstConsultationFeeNoOnly clinics whose first consultation costs at most this, in GBP.

Output Schema

NameRequiredDescription
noteNo
totalYesHow many matched in all; narrow the query when this exceeds the results
resultsYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare this a safe, read-only, idempotent lookup; the description adds material behavior beyond that, including the 25-result cap, offset paging, the exact returned fields, the fact that year-one fees exclude medicine, and a legal caveat that listed conditions are referral scope rather than eligibility. It also explicitly states what is not returned (doctors, appointment availability).

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?

Dense but front-loaded: the first sentence states the purpose, the next sentences cover location, filters, sorting, return shape, caveats, and alternatives in that order. It is long for a single paragraph, but nearly every clause carries operational information.

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?

Despite 12 parameters, no required fields, and an output schema, the description covers the decision-relevant context: alternatives, pagination, return contents, fee semantics, and the important qualification caveat. Nothing needed to call it correctly is missing.

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 100%, so the schema carries the parameter documentation and baseline is 3. The description still adds useful synthesis, explaining 'nearest first, with miles' for `near`, paging via `offset`, and grouping the filters by purpose, which goes modestly beyond the schema text.

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?

States a specific verb and resource ('Find UK clinics that can prescribe cannabis-based medicines') and immediately distinguishes itself from the sibling tools get_listing and compare_providers. An agent can tell exactly what this tool returns versus neighboring tools without opening a schema.

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

Usage Guidelines5/5

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

Gives explicit routing: use `near` for 'near me' questions, use get_listing for one clinic in full, and use compare_providers to weigh several. It also enumerates the filter and sort options, so the agent knows when each control applies.

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

find_pharmaciesFind dispensing pharmaciesA
Read-onlyIdempotent
Inspect

Find UK pharmacies that dispense cannabis-based medicines against a prescription a clinic has already issued. Use near (postcode or town) for nearest first with miles; filter by delivery, in-person collection and review score. Returns up to 25 pharmacies at a time (page on with offset) with slug, page URL, town, distance, delivery and collection, and review score. A pharmacy cannot prescribe. It does not return stock, prices, or which products a pharmacy holds: those are shown only to patients and professionals with access. For delivery prices and GPhC registration use get_listing, or compare_providers for several.

NameRequiredDescriptionDefault
nearNoA UK postcode, outcode or town, e.g. "M1 1AE", "LS6" or "Bristol". Sorts nearest first and adds miles.
sortNodistance (default with `near`), az (default otherwise), za, city, rating.
limitNoHow many to return, 1-25. Default 10.
queryNoPharmacy name, matched as text. For a place use `near`.
offsetNoSkip this many results, for the next page (the answer says which offset comes next). Default 0.
deliversNoOnly pharmacies that deliver (most dispense UK-wide by post).
minRatingNoOnly pharmacies with patient reviews averaging 3+ or 4+.
collectionNoOnly pharmacies offering in-person collection.
radiusMilesNoOnly within this many miles of `near`. Ignored without `near`.

Output Schema

NameRequiredDescription
noteNo
totalYesHow many matched in all; narrow the query when this exceeds the results
resultsYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the read-only annotations, the description discloses important behavioral limits: it returns up to 25 results at a time, paginates via offset, excludes stock/prices/product holdings, and notes that those restricted fields are shown only to patients and professionals with access.

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 front-loaded with the core purpose, then covers usage, return shape, limitations, and alternatives in dense, useful sentences. There is no redundant or filler text.

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?

Given the annotations and output schema, the description is complete enough for an agent to call the tool correctly. It covers purpose, filtering, pagination, return fields, access limitations, and when to use sibling tools instead.

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%, so the parameters are already documented in the schema. The description reinforces key usage such as `near` triggering nearest-first miles and filters, but it does not add syntax or semantics beyond what the schema already provides.

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: finding UK pharmacies that dispense cannabis-based medicines against an already-issued clinic prescription. It also distinguishes the tool from get_listing and compare_providers, and explicitly notes that a pharmacy cannot prescribe.

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

Usage Guidelines5/5

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

It explains how to use `near` for nearest-first distance results, how to filter by delivery, collection, and review score, and how to page with `offset`. It also names alternatives: get_listing for delivery prices and GPhC registration, and compare_providers for comparing several providers.

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

find_productsFind medical cannabis productsA
Read-onlyIdempotent
Inspect

Find cannabis-based medicines on the UK market by product, brand or strain name, or by dose form. Returns up to 25 products at a time (page on with offset) with page URL, slug, brand, dose form, THC and CBD content, and the latest price a UK pharmacy charged (naming no pharmacy) when Findabis publishes one. It does not return stock, pack sizes on offer, per-pharmacy prices or which pharmacies dispense a product: those are shown only to patients and professionals with access. A listing is not a statement that a product suits anyone. For one product in full, use get_product with its slug.

NameRequiredDescriptionDefault
sortNoAlphabetical, name_asc (default) or name_desc.
limitNoHow many to return, 1-25. Default 10.
queryNoProduct, brand or strain name, e.g. "Pink Kush" or "Tilray". Omit to browse.
offsetNoSkip this many results, for the next page (the answer says which offset comes next). Default 0.
categoryNoDose form. CARTRIDGE is a vape cartridge.

Output Schema

NameRequiredDescription
noteNo
totalYesHow many matched in all; narrow the query when this exceeds the results
resultsYes

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses page size cap of 25, offset pagination, the fields returned, the deliberate omission of pharmacy identity, that access-gated data exists for patients/professionals, and that a listing is not a suitability statement. Annotations already confirm it is read-only and idempotent; the description adds substantive 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/5

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

Front-loads what the tool does and what it searches by, then covers pagination, returned fields, exclusions, and the alternative get_product in a compact sequence. Every sentence earns its place and none is redundant.

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?

Even though an output schema exists, the description usefully names the returned fields (page URL, slug, brand, dose form, THC/CBD, latest price) and the deliberate omissions. Given five optional parameters and a clear exclusions statement, an agent has everything needed to invoke it correctly.

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%, so query, category, sort, limit and offset are already documented. The description only restates the 25-result cap and offset paging, without adding syntax, defaults or constraints beyond the schema; baseline 3 applies.

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?

States a specific verb and resource ('Find cannabis-based medicines') plus the searchable dimensions (product, brand, strain, dose form), and distinguishes itself from get_product for full detail. An agent can separate it from sibling find_* tools by the resource and search inputs.

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

Usage Guidelines5/5

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

Explicitly gives when-to-use (browse or search by name/dose form) and when-not (stock, pack sizes, per-pharmacy pricing, dispensing pharmacies are not returned), and names the alternative 'get_product' for a single full record. This is exactly the routing information an agent needs against eight siblings.

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

find_strainsFind cannabis strainsA
Read-onlyIdempotent
Inspect

Find cannabis strain profiles by name or genetics (Indica, Sativa or Hybrid). Returns up to 25 strains at a time (page on with offset) with page URL, slug, genetics and THC and CBD ranges. A strain is a plant lineage, not something a pharmacy dispenses — use find_products for that. Findabis publishes no effects, medical uses or side effects for strains, so none are returned and none should be inferred. For terpenes, flavours and lineage, use get_listing with kind "strain".

NameRequiredDescriptionDefault
limitNoHow many to return, 1-25. Default 10.
queryNoStrain name or nickname, e.g. "Gelato". Omit to browse.
offsetNoSkip this many results, for the next page (the answer says which offset comes next). Default 0.
geneticsNoThe strain type: Indica, Sativa or Hybrid.

Output Schema

NameRequiredDescription
noteNo
totalYesHow many matched in all; narrow the query when this exceeds the results
resultsYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover read-only, idempotent, closed-world, non-destructive, so the description goes further: it discloses page size (25), the offset paging mechanism, and — most valuably — that effects, medical uses and side effects are deliberately absent and must not be inferred. That negative disclosure directly prevents hallucinated output.

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?

Front-loaded with purpose, then return shape, then disambiguation — good ordering with no filler. The enumeration of returned fields (page URL, slug, genetics, THC/CBD ranges) is slightly redundant given an output schema exists, but it is compact and aids selection.

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?

Covers everything an agent needs: what it searches, how paging works, what comes back, what deliberately does not come back, and which sibling to use for adjacent needs. With an output schema present, no further return-value detail is required.

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 100%, so the baseline is 3; the description adds meaning beyond it by explaining the offset as 'page on with `offset`' and tying limit to the 25-cap paging model. It does not restate query/genetics semantics, which the schema already handles well.

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?

States a specific verb and resource ('Find cannabis strain profiles') plus the two lookup axes (name or genetics). It also preempts the most likely confusion by declaring a strain is a plant lineage, not a dispensable product, which separates it from find_products without the agent needing to open either schema.

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

Usage Guidelines5/5

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

Explicit routing to alternatives: find_products for dispensable products, get_listing with kind "strain" for terpenes/flavours/lineage. It also gives a positive usage cue ('Omit query to browse' is in schema, and the description frames name/genetics as the two search modes).

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

get_listingGet one clinic, pharmacy, strain or brandA
Read-onlyIdempotent
Inspect

The public facts on one clinic, pharmacy, strain or brand page, by kind and the page slug from find_clinics, find_pharmacies, find_strains, find_brands or search_findabis. Clinic: address, consultation types and fees, published price list, CQC rating, which patients its policy takes, partner pharmacies. Pharmacy: address, delivery and collection, delivery prices, GPhC registration, partner clinics. Strain: genetics, cannabinoid ranges, terpenes, flavours, lineage, products made from it. Brand: location, website and products. Not returned: stock, per-pharmacy medicine prices, staff, or anything about patients. For a product, use get_product.

NameRequiredDescriptionDefault
kindYesWhat the slug names: clinic, pharmacy, strain or brand.
slugYesThe page slug from a find_* tool or search_findabis, e.g. "green-leaf-clinic".

Output Schema

NameRequiredDescription
urlYes
kindYes
nameYes
slugYes
brandNo
clinicNo
strainNo
pharmacyNo
descriptionYes
descriptionAiAssistedYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds value beyond that by documenting the per-kind payload shape and, importantly, what is explicitly excluded, which prevents an agent from calling it hoping for stock or pricing data. It does not discuss error behaviour for an unknown kind/slug pair.

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?

Front-loaded with the core verb and resource, then the routing constraint, then scope. The four per-kind field lists are dense and partly overlap with the output schema, so a little is redundant, but nothing is filler and the ordering is deliberate.

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?

Two required params, an output schema for return values, and full annotation coverage — the description closes every remaining gap: which kinds exist, where slugs come from, what differs per kind, and what will never be returned.

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 coverage is 100% and the enum on `kind` already constrains values, so the schema does the heavy lifting. The description adds meaning by tying each `kind` value to a distinct returned field set, but the slug-origin detail largely repeats the schema's own description text. Baseline 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?

States a specific verb plus resource ('public facts on one ... page') and enumerates the exact entity types it accepts. It also names the sibling it is not (get_product), so an agent can route between them without opening a schema.

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

Usage Guidelines5/5

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

Explicitly tells the agent where the `slug` value originates (find_clinics, find_pharmacies, find_strains, find_brands, search_findabis) and gives an explicit alternative for products: 'For a product, use get_product.' It also states the negative case — stock, per-pharmacy prices, staff and patient data are not returned.

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

get_productGet one product in fullA
Read-onlyIdempotent
Inspect

Everything public about one product, by its slug from find_products or search_findabis: dose form and strength, strain and brand, terpenes, what it contains (carrier oil, allergens, capsule shell), dosage and storage notes, patient leaflets and FAQs, and its price range across UK pharmacies when Findabis publishes one. Not returned: stock, pack sizes on offer, and which pharmacies dispense it at what price — the product page shows those only to patients and professionals with access. It describes the product, never who should take it.

NameRequiredDescriptionDefault
slugYesThe product page slug from find_products or search_findabis, e.g. "demo-kush-t20-c1".

Output Schema

NameRequiredDescription
cbdYes
thcYes
urlYes
faqsYes
formYesDose form as the page labels it, e.g. "Dried flower"
nameYes
slugYes
brandYes
imageYes
dosageYes
strainYes
storageYes
categoryYes
terpenesYes
withheldYes
allergensYes
chemotypeYesTHC-dominant, CBD-dominant or balanced, from the cannabinoid figures
documentsYes
carrierOilYes
priceRangeYesLowest to highest current price across UK pharmacies, naming none; null when not published
descriptionYes
capsuleShellYes
discontinuedYes
oilFlowerEquivalenceYes
descriptionAiAssistedYes

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the readOnly/idempotent annotations by disclosing what is NOT returned (stock, pack sizes, per-pharmacy pricing) and why — those fields are gated to authenticated patients and professionals. The closing scope constraint ('describes the product, never who should take it') is exactly the kind of behavioral boundary an agent needs.

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?

Front-loads the resource and scope in the first clause, then spends its remaining sentences on exclusions and boundaries that are genuinely load-bearing. The enumeration of returned fields is somewhat redundant given the output schema, but the prose stays tight and purposeful.

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 an output schema present, the description need not document return values, yet it still conveys the access model, exclusions, and scope limits. Nothing an agent needs to call this correctly is missing.

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 single slug parameter already carries its origin and an example, so the schema does the heavy lifting. The description reinforces the slug source but adds no new syntax or format detail beyond it.

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?

States a specific verb+resource ('Everything public about one product') and pins the identifier ('by its slug from find_products or search_findabis'), which cleanly separates it from the search/discovery siblings. An agent knows exactly what it retrieves without opening the schema.

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 tells the agent where the required slug comes from (find_products or search_findabis), giving clear preconditions for use. It does not explicitly contrast with the sibling get_listing, so the routing guidance is strong but not complete.

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

search_findabisSearch everythingA
Read-onlyIdempotent
Inspect

One text search across clinics, pharmacies, products, strains and brands. Use it when you do not yet know which kind the question is about, or to turn a name into a slug; then call the specific tool, which returns more detail. Returns names, kinds, slugs and page URLs only — no prices, stock or medical information.

NameRequiredDescriptionDefault
limitNoMost results per kind, 1-20. Default 8.
queryYesWhat to look for: a name, brand, strain, town or postcode.

Output Schema

NameRequiredDescription
resultsYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare the read-only, idempotent, non-destructive, closed-world profile, so the safety bar is covered. The description adds genuine value beyond that by scoping the payload: 'Returns names, kinds, slugs and page URLs only — no prices, stock or medical information.' It stops short of describing result ordering or cross-kind merging behavior for the limit parameter, which is the remaining gap.

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 sentences, each doing distinct work: scope of search, when to use it and what to do next, and what the response does and does not contain. The most decisive information (what it searches) is front-loaded with zero filler.

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 an output schema present, the description needn't enumerate return fields, yet it still summarizes them and flags the notable exclusions. Combined with annotation coverage and a fully documented two-parameter schema, an agent has everything required to select and invoke this tool correctly.

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%, with both 'query' and 'limit' documented inline (including the 1-20 range and default 8), so the baseline of 3 applies. The description's mention of turning 'a name into a slug' hints at query intent but adds no syntax or format detail beyond what the schema already supplies.

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?

States a specific verb and resource — 'One text search across clinics, pharmacies, products, strains and brands' — and its breadth makes it immediately distinguishable from the narrower siblings find_clinics, find_products, etc. An agent can tell what it does without opening the schema.

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

Usage Guidelines5/5

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

Explicitly names the selection condition: 'Use it when you do not yet know which kind the question is about, or to turn a name into a slug; then call the specific tool, which returns more detail.' It gives both a when-to-use rule and the follow-up alternative, which is exactly the routing guidance needed against six sibling finders.

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.

  1. 5 tool updates
    • Addedfind_brands
    • Changedfind_clinics1 field changed
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Skip this many results, for the next page (the answer says which offset comes next). Default 0.",
        +  "maximum": 500,
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedfind_pharmacies1 field changed
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Skip this many results, for the next page (the answer says which offset comes next). Default 0.",
        +  "maximum": 500,
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedfind_products1 field changed
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Skip this many results, for the next page (the answer says which offset comes next). Default 0.",
        +  "maximum": 500,
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedfind_strains1 field changed
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Skip this many results, for the next page (the answer says which offset comes next). Default 0.",
        +  "maximum": 500,
        +  "minimum": 0,
        +  "type": "integer"
        +}
  2. 4 tool updates
    • Addedcompare_providers
    • Changedfind_clinics14 fields changed
      • changedInput schema / properties / acceptingPatients / description
        Previous value: -"Only clinics showing 'Accepting patients' (an active published eligibility policy)."New value: +"Only clinics showing 'Accepting patients' (an active published policy)."
      • addedInput schema / properties / condition
        Added value: +{
        +  "description": "Only clinics whose published policy lists this condition. One of: Anxiety / Depression; PTSD; Insomnia / Sleep disorders; Chronic pain; Neuropathic pain; Multiple Sclerosis / Spasticity; Cancer symptoms; IBD (Crohn's / Ulcerative Colitis); Migraine; Arthritis / inflammatory pain; ADHD / Autism spectrum symptoms; Endometriosis / women's health symptoms. A listed condition is the clinic's referral scope, never a statement that anyone qualifies.",
        +  "maxLength": 120,
        +  "type": "string"
        +}
      • addedInput schema / properties / consultationType
        Added value: +{
        +  "description": "Only clinics offering ONLINE (video), IN_PERSON or PHONE.",
        +  "enum": [
        +    "ONLINE",
        +    "IN_PERSON",
        +    "PHONE"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / cqc
        Added value: +{
        +  "description": "CQC rating filter; GOOD_OR_BETTER keeps Good and Outstanding.",
        +  "enum": [
        +    "GOOD_OR_BETTER",
        +    "OUTSTANDING",
        +    "GOOD",
        +    "REQUIRES_IMPROVEMENT",
        +    "NOT_RATED"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / maxFirstConsultationFee
        Added value: +{
        +  "description": "Only clinics whose first consultation costs at most this, in GBP.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / near
        Added value: +{
        +  "description": "A UK postcode, outcode or town, e.g. \"M1 1AE\", \"LS6\" or \"Bristol\". Sorts nearest first and adds miles.",
        +  "maxLength": 64,
        +  "minLength": 2,
        +  "type": "string"
        +}
      • changedInput schema / properties / patientType / description
        Previous value: -"NEW_PATIENT (never prescribed), TRANSFER (moving from another clinic) or ACTIVE_PATIENT (already under treatment). Leaves out clinics whose published policy does not take that type, and price sorts cost that route."New value: +"NEW_PATIENT, TRANSFER or ACTIVE_PATIENT. Drops clinics whose policy does not take it, and prices year one for that route."
      • changedInput schema / properties / query / description
        Previous value: -"Clinic name, town or postcode, matched as text (not by distance). Omit to list all."New value: +"Clinic name, matched as text. For a place use `near`."
      • addedInput schema / properties / radiusMiles
        Added value: +{
        +  "description": "Only within this many miles of `near`. Ignored without `near`.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 500,
        +  "type": "number"
        +}
      • changedInput schema / properties / sort / description
        Previous value: -"az (default), za, or by published first-year cost: priceLowHigh / priceHighLow."New value: +"distance (default with `near`), az (default otherwise), za, cheapest / dearest by year-one clinic fees, rating."
      • changedInput schema / properties / sort / enum
        Previous value: -[
        -  "az",
        -  "za",
        -  "priceLowHigh",
        -  "priceHighLow"
        -]New value: +[
        +  "distance",
        +  "az",
        +  "za",
        +  "cheapest",
        +  "dearest",
        +  "rating"
        +]
      • addedOutput schema / properties / results / items / properties / distanceMiles
        Added value: +{
        +  "description": "Miles from `near`; null when no place was given",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / results / items / properties / firstYearClinicFees
        Added value: +{
        +  "description": "Estimated year-one clinic fees (consultations, membership, the clinic's prescription fee) for the asked patient type with 4 follow-ups and 12 prescriptions; never includes medicine; null when no price list is published",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / results / items / required
        Previous value: -[
        -  "name",
        -  "slug",
        -  "url",
        -  "city",
        -  "postcode",
        -  "currency",
        -  "initialConsultationFee",
        -  "followUpConsultationFee",
        -  "consultationTypes",
        -  "cqcRating",
        -  "rating",
        -  "acceptingPatients",
        -  "patientTypes"
        -]New value: +[
        +  "name",
        +  "slug",
        +  "url",
        +  "city",
        +  "postcode",
        +  "distanceMiles",
        +  "currency",
        +  "initialConsultationFee",
        +  "followUpConsultationFee",
        +  "firstYearClinicFees",
        +  "consultationTypes",
        +  "cqcRating",
        +  "rating",
        +  "acceptingPatients",
        +  "patientTypes"
        +]
    • Changedfind_pharmacies10 fields changed
      • addedInput schema / properties / collection
        Added value: +{
        +  "description": "Only pharmacies offering in-person collection.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / delivers / description
        Previous value: -"Only pharmacies that offer delivery."New value: +"Only pharmacies that deliver (most dispense UK-wide by post)."
      • addedInput schema / properties / minRating
        Added value: +{
        +  "description": "Only pharmacies with patient reviews averaging 3+ or 4+.",
        +  "enum": [
        +    "3_plus",
        +    "4_plus"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / near
        Added value: +{
        +  "description": "A UK postcode, outcode or town, e.g. \"M1 1AE\", \"LS6\" or \"Bristol\". Sorts nearest first and adds miles.",
        +  "maxLength": 64,
        +  "minLength": 2,
        +  "type": "string"
        +}
      • changedInput schema / properties / query / description
        Previous value: -"Pharmacy name, town or postcode, matched as text (not by distance). Omit to list all."New value: +"Pharmacy name, matched as text. For a place use `near`."
      • addedInput schema / properties / radiusMiles
        Added value: +{
        +  "description": "Only within this many miles of `near`. Ignored without `near`.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 500,
        +  "type": "number"
        +}
      • changedInput schema / properties / sort / description
        Previous value: -"az (default), za, or by town."New value: +"distance (default with `near`), az (default otherwise), za, city, rating."
      • changedInput schema / properties / sort / enum
        Previous value: -[
        -  "az",
        -  "za",
        -  "city"
        -]New value: +[
        +  "distance",
        +  "az",
        +  "za",
        +  "city",
        +  "rating"
        +]
      • addedOutput schema / properties / results / items / properties / distanceMiles
        Added value: +{
        +  "description": "Miles from `near`; null when no place was given",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / results / items / required
        Previous value: -[
        -  "name",
        -  "slug",
        -  "url",
        -  "city",
        -  "postcode",
        -  "offersDelivery",
        -  "offersCollection",
        -  "rating"
        -]New value: +[
        +  "name",
        +  "slug",
        +  "url",
        +  "city",
        +  "postcode",
        +  "distanceMiles",
        +  "offersDelivery",
        +  "offersCollection",
        +  "rating"
        +]
    • Changedget_listing5 fields changed
      • addedOutput schema / properties / clinic / properties / distanceMiles
        Added value: +{
        +  "description": "Miles from `near`; null when no place was given",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / clinic / properties / firstYearClinicFees
        Added value: +{
        +  "description": "Estimated year-one clinic fees (consultations, membership, the clinic's prescription fee) for the asked patient type with 4 follow-ups and 12 prescriptions; never includes medicine; null when no price list is published",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / clinic / required
        Previous value: -[
        -  "name",
        -  "slug",
        -  "url",
        -  "city",
        -  "postcode",
        -  "currency",
        -  "initialConsultationFee",
        -  "followUpConsultationFee",
        -  "consultationTypes",
        -  "cqcRating",
        -  "rating",
        -  "acceptingPatients",
        -  "patientTypes",
        -  "address",
        -  "website",
        -  "pricingModel",
        -  "priceList",
        -  "cqcRegistration",
        -  "cqcReportUrl",
        -  "minimumAge",
        -  "maximumAge",
        -  "partnerPharmacies",
        -  "otherLocations"
        -]New value: +[
        +  "name",
        +  "slug",
        +  "url",
        +  "city",
        +  "postcode",
        +  "distanceMiles",
        +  "currency",
        +  "initialConsultationFee",
        +  "followUpConsultationFee",
        +  "firstYearClinicFees",
        +  "consultationTypes",
        +  "cqcRating",
        +  "rating",
        +  "acceptingPatients",
        +  "patientTypes",
        +  "address",
        +  "website",
        +  "pricingModel",
        +  "priceList",
        +  "cqcRegistration",
        +  "cqcReportUrl",
        +  "minimumAge",
        +  "maximumAge",
        +  "partnerPharmacies",
        +  "otherLocations"
        +]
      • addedOutput schema / properties / pharmacy / properties / distanceMiles
        Added value: +{
        +  "description": "Miles from `near`; null when no place was given",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / pharmacy / required
        Previous value: -[
        -  "name",
        -  "slug",
        -  "url",
        -  "city",
        -  "postcode",
        -  "offersDelivery",
        -  "offersCollection",
        -  "rating",
        -  "address",
        -  "website",
        -  "deliveryOptions",
        -  "gphcNumber",
        -  "gphcInspectionOutcome",
        -  "gphcReportUrl",
        -  "partnerClinics",
        -  "otherLocations"
        -]New value: +[
        +  "name",
        +  "slug",
        +  "url",
        +  "city",
        +  "postcode",
        +  "distanceMiles",
        +  "offersDelivery",
        +  "offersCollection",
        +  "rating",
        +  "address",
        +  "website",
        +  "deliveryOptions",
        +  "gphcNumber",
        +  "gphcInspectionOutcome",
        +  "gphcReportUrl",
        +  "partnerClinics",
        +  "otherLocations"
        +]
  3. 7 tool updates
    • Changedfind_clinics9 fields changed
      • removedInput schema / properties / acceptingNewPatients
        Removed value: -{
        -  "description": "Only clinics currently taking new patients.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / acceptingPatients
        Added value: +{
        +  "description": "Only clinics showing 'Accepting patients' (an active published eligibility policy).",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"Default 10."New value: +"How many to return, 1-25. Default 10."
      • addedInput schema / properties / patientType
        Added value: +{
        +  "description": "NEW_PATIENT (never prescribed), TRANSFER (moving from another clinic) or ACTIVE_PATIENT (already under treatment). Leaves out clinics whose published policy does not take that type, and price sorts cost that route.",
        +  "enum": [
        +    "NEW_PATIENT",
        +    "TRANSFER",
        +    "ACTIVE_PATIENT"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / query / description
        Previous value: -"Name, city or postcode. Postcode is matched as text, not by distance."New value: +"Clinic name, town or postcode, matched as text (not by distance). Omit to list all."
      • addedInput schema / properties / query / maxLength
        Added value: +120
      • changedInput schema / properties / sort / description
        Previous value: -"Default az."New value: +"az (default), za, or by published first-year cost: priceLowHigh / priceHighLow."
      • changedInput schema / properties / sort / enum
        Previous value: -[
        -  "az",
        -  "priceLowHigh",
        -  "priceHighLow"
        -]New value: +[
        +  "az",
        +  "za",
        +  "priceLowHigh",
        +  "priceHighLow"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "note": {
        +      "type": "string"
        +    },
        +    "results": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "acceptingPatients": {
        +            "description": "Shows 'Accepting patients' (an active published eligibility policy)",
        +            "type": "boolean"
        +          },
        +          "city": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "consultationTypes": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "cqcRating": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "currency": {
        +            "type": "string"
        +          },
        +          "followUpConsultationFee": {
        +            "$ref": "#/properties/results/items/properties/initialConsultationFee"
        +          },
        +          "initialConsultationFee": {
        +            "description": "In `currency`; null when not published",
        +            "type": [
        +              "number",
        +              "null"
        +            ]
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "patientTypes": {
        +            "anyOf": [
        +              {
        +                "items": {
        +                  "enum": [
        +                    "NEW_PATIENT",
        +                    "TRANSFER",
        +                    "ACTIVE_PATIENT"
        +                  ],
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "description": "Patient types the published policy takes; null when the clinic publishes no policy"
        +          },
        +          "postcode": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "rating": {
        +            "anyOf": [
        +              {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "average": {
        +                    "type": "number"
        +                  },
        +                  "count": {
        +                    "type": "integer"
        +                  }
        +                },
        +                "required": [
        +                  "average",
        +                  "count"
        +                ],
        +                "type": "object"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "description": "Published patient reviews; null when there are none"
        +          },
        +          "slug": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "url": {
        +            "anyOf": [
        +              {
        +                "format": "uri",
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "description": "Canonical Findabis page, absolute; null when the listing has no page"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "slug",
        +          "url",
        +          "city",
        +          "postcode",
        +          "currency",
        +          "initialConsultationFee",
        +          "followUpConsultationFee",
        +          "consultationTypes",
        +          "cqcRating",
        +          "rating",
        +          "acceptingPatients",
        +          "patientTypes"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total": {
        +      "description": "How many matched in all; narrow the query when this exceeds the results",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "results",
        +    "total"
        +  ],
        +  "type": "object"
        +}
    • Changedfind_pharmacies6 fields changed
      • changedInput schema / properties / delivers / description
        Previous value: -"Only pharmacies that deliver."New value: +"Only pharmacies that offer delivery."
      • changedInput schema / properties / limit / description
        Previous value: -"Default 10."New value: +"How many to return, 1-25. Default 10."
      • changedInput schema / properties / query / description
        Previous value: -"Name, city or postcode."New value: +"Pharmacy name, town or postcode, matched as text (not by distance). Omit to list all."
      • addedInput schema / properties / query / maxLength
        Added value: +120
      • addedInput schema / properties / sort
        Added value: +{
        +  "description": "az (default), za, or by town.",
        +  "enum": [
        +    "az",
        +    "za",
        +    "city"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "note": {
        +      "type": "string"
        +    },
        +    "results": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "city": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "offersCollection": {
        +            "type": "boolean"
        +          },
        +          "offersDelivery": {
        +            "type": "boolean"
        +          },
        +          "postcode": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "rating": {
        +            "anyOf": [
        +              {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "average": {
        +                    "type": "number"
        +                  },
        +                  "count": {
        +                    "type": "integer"
        +                  }
        +                },
        +                "required": [
        +                  "average",
        +                  "count"
        +                ],
        +                "type": "object"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "description": "Published patient reviews; null when there are none"
        +          },
        +          "slug": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "url": {
        +            "anyOf": [
        +              {
        +                "format": "uri",
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "description": "Canonical Findabis page, absolute; null when the listing has no page"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "slug",
        +          "url",
        +          "city",
        +          "postcode",
        +          "offersDelivery",
        +          "offersCollection",
        +          "rating"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total": {
        +      "description": "How many matched in all; narrow the query when this exceeds the results",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "results",
        +    "total"
        +  ],
        +  "type": "object"
        +}
    • Changedfind_products7 fields changed
      • changedInput schema / properties / category / description
        Previous value: -"Dose form."New value: +"Dose form. CARTRIDGE is a vape cartridge."
      • changedInput schema / properties / limit / description
        Previous value: -"Default 10."New value: +"How many to return, 1-25. Default 10."
      • changedInput schema / properties / query / description
        Previous value: -"Product, brand or strain name."New value: +"Product, brand or strain name, e.g. \"Pink Kush\" or \"Tilray\". Omit to browse."
      • addedInput schema / properties / query / maxLength
        Added value: +120
      • changedInput schema / properties / sort / description
        Previous value: -"Default name_asc."New value: +"Alphabetical, name_asc (default) or name_desc."
      • changedInput schema / properties / sort / enum
        Previous value: -[
        -  "name_asc",
        -  "price_asc",
        -  "price_desc"
        -]New value: +[
        +  "name_asc",
        +  "name_desc"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "note": {
        +      "type": "string"
        +    },
        +    "results": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "brand": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "category": {
        +            "description": "Dose form: FLOWER, OIL, CAPSULE, EDIBLE, TOPICAL, CARTRIDGE or HASH",
        +            "type": "string"
        +          },
        +          "cbd": {
        +            "description": "CBD content as the page prints it, unit included",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "discontinued": {
        +            "type": "boolean"
        +          },
        +          "latestPrice": {
        +            "anyOf": [
        +              {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "amount": {
        +                    "type": "number"
        +                  },
        +                  "currency": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "amount",
        +                  "currency"
        +                ],
        +                "type": "object"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "description": "The latest price any UK pharmacy charged, naming no pharmacy; null when not published"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "slug": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "thc": {
        +            "description": "THC content as the page prints it, unit included",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "url": {
        +            "anyOf": [
        +              {
        +                "format": "uri",
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "description": "Canonical Findabis page, absolute; null when the listing has no page"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "slug",
        +          "url",
        +          "brand",
        +          "category",
        +          "thc",
        +          "cbd",
        +          "discontinued",
        +          "latestPrice"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total": {
        +      "description": "How many matched in all; narrow the query when this exceeds the results",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "results",
        +    "total"
        +  ],
        +  "type": "object"
        +}
    • Changedfind_strains6 fields changed
      • changedInput schema / properties / genetics / description
        Previous value: -"Indica, Sativa or Hybrid."New value: +"The strain type: Indica, Sativa or Hybrid."
      • addedInput schema / properties / genetics / enum
        Added value: +[
        +  "Indica",
        +  "Sativa",
        +  "Hybrid"
        +]
      • changedInput schema / properties / limit / description
        Previous value: -"Default 10."New value: +"How many to return, 1-25. Default 10."
      • changedInput schema / properties / query / description
        Previous value: -"Strain name."New value: +"Strain name or nickname, e.g. \"Gelato\". Omit to browse."
      • addedInput schema / properties / query / maxLength
        Added value: +120
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "note": {
        +      "type": "string"
        +    },
        +    "results": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "cbdPercent": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "genetics": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "slug": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "thcPercent": {
        +            "description": "A figure or a range, e.g. \"18-22\"",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "url": {
        +            "anyOf": [
        +              {
        +                "format": "uri",
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "description": "Canonical Findabis page, absolute; null when the listing has no page"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "slug",
        +          "url",
        +          "genetics",
        +          "thcPercent",
        +          "cbdPercent"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total": {
        +      "description": "How many matched in all; narrow the query when this exceeds the results",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "results",
        +    "total"
        +  ],
        +  "type": "object"
        +}
    • Addedget_listing
    • Changedget_product3 fields changed
      • changedInput schema / properties / slug / description
        Previous value: -"The product page slug, e.g. \"demo-kush-t20-c1\"."New value: +"The product page slug from find_products or search_findabis, e.g. \"demo-kush-t20-c1\"."
      • addedInput schema / properties / slug / maxLength
        Added value: +200
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "allergens": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "brand": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "capsuleShell": {
        +      "$ref": "#/properties/brand"
        +    },
        +    "carrierOil": {
        +      "$ref": "#/properties/brand"
        +    },
        +    "category": {
        +      "type": "string"
        +    },
        +    "cbd": {
        +      "$ref": "#/properties/brand"
        +    },
        +    "chemotype": {
        +      "description": "THC-dominant, CBD-dominant or balanced, from the cannabinoid figures",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "description": {
        +      "$ref": "#/properties/brand"
        +    },
        +    "descriptionAiAssisted": {
        +      "type": "boolean"
        +    },
        +    "discontinued": {
        +      "type": "boolean"
        +    },
        +    "documents": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "kind": {
        +            "type": "string"
        +          },
        +          "title": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "anyOf": [
        +              {
        +                "format": "uri",
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          }
        +        },
        +        "required": [
        +          "title",
        +          "kind",
        +          "url"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "dosage": {
        +      "$ref": "#/properties/brand"
        +    },
        +    "faqs": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "aiAssisted": {
        +            "type": "boolean"
        +          },
        +          "answer": {
        +            "type": "string"
        +          },
        +          "question": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "question",
        +          "answer",
        +          "aiAssisted"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "form": {
        +      "description": "Dose form as the page labels it, e.g. \"Dried flower\"",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "image": {
        +      "anyOf": [
        +        {
        +          "format": "uri",
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "oilFlowerEquivalence": {
        +      "$ref": "#/properties/brand"
        +    },
        +    "priceRange": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "currency": {
        +              "type": "string"
        +            },
        +            "max": {
        +              "type": "number"
        +            },
        +            "min": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "min",
        +            "max",
        +            "currency"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Lowest to highest current price across UK pharmacies, naming none; null when not published"
        +    },
        +    "slug": {
        +      "type": "string"
        +    },
        +    "storage": {
        +      "$ref": "#/properties/brand"
        +    },
        +    "strain": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "genetics": {
        +              "$ref": "#/properties/brand"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "anyOf": [
        +                {
        +                  "format": "uri",
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            }
        +          },
        +          "required": [
        +            "name",
        +            "genetics",
        +            "url"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "terpenes": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "name": {
        +            "type": "string"
        +          },
        +          "percent": {
        +            "type": [
        +              "number",
        +              "null"
        +            ]
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "percent"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "thc": {
        +      "$ref": "#/properties/brand"
        +    },
        +    "url": {
        +      "anyOf": [
        +        {
        +          "format": "uri",
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "withheld": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "name",
        +    "slug",
        +    "url",
        +    "category",
        +    "form",
        +    "brand",
        +    "thc",
        +    "cbd",
        +    "chemotype",
        +    "discontinued",
        +    "strain",
        +    "terpenes",
        +    "carrierOil",
        +    "allergens",
        +    "capsuleShell",
        +    "priceRange",
        +    "oilFlowerEquivalence",
        +    "description",
        +    "descriptionAiAssisted",
        +    "dosage",
        +    "storage",
        +    "image",
        +    "documents",
        +    "faqs",
        +    "withheld"
        +  ],
        +  "type": "object"
        +}
    • Changedsearch_findabis4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Default 8 per kind."New value: +"Most results per kind, 1-20. Default 8."
      • changedInput schema / properties / query / description
        Previous value: -"What to look for."New value: +"What to look for: a name, brand, strain, town or postcode."
      • addedInput schema / properties / query / maxLength
        Added value: +120
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "results": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "kind": {
        +            "enum": [
        +              "clinic",
        +              "pharmacy",
        +              "product",
        +              "strain",
        +              "brand"
        +            ],
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "slug": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "url": {
        +            "anyOf": [
        +              {
        +                "format": "uri",
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ],
        +            "description": "Canonical Findabis page, absolute; null when the listing has no page"
        +          }
        +        },
        +        "required": [
        +          "kind",
        +          "name",
        +          "slug",
        +          "url"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "results"
        +  ],
        +  "type": "object"
        +}
  4. 6 tool updates
    • First observedfind_clinics
    • First observedfind_pharmacies
    • First observedfind_products
    • First observedfind_strains
    • First observedget_product
    • First observedsearch_findabis

Publisher details

Operator
Findabis.com · Publisher source
Vendor relationship
Unknown
Trust center
Unknown
Restrictions
Unknown

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables querying the UK MHRA medicines register to search by product, brand, or active substance, retrieve all documents for a licence, and monitor recent changes to published medicines documents.
    5 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides access to the European Medicines Agency's public medicines register and related datasets, enabling search and monitoring of approved medicines, herbal substances, shortages, safety communications, referrals, and post-authorisation procedures.
    283 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides programmatic access to UK legal documents with hybrid semantic search and Model Context Protocol integration for AI assistants.
    76
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    UK public procurement data for AI agents. Tenders, contracts, buyer and supplier profiles over MCP and REST. 250 free credits.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.