Findabis
Server Details
Public directory of UK medical cannabis clinics, pharmacies, products and strains.
- 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
Scored across 9 tools
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.
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.
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.
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 toolscompare_providersCompare clinics or pharmaciesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Compare clinics or pharmacies (not both at once). | |
| slugs | Yes | 2-6 page slugs from find_clinics / find_pharmacies. | |
| patientType | No | Clinics: price year one as NEW_PATIENT (default), TRANSFER or ACTIVE_PATIENT. | |
| followUpsPerYear | No | Clinics: follow-up consultations a year. Default 4. | |
| prescriptionsPerYear | No | Clinics: repeat prescriptions a year. Default 12. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| note | Yes | |
| clinics | No | |
| missing | Yes | Slugs with no such listing |
| pharmacies | No |
TDQS
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.
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.
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.
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.
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.
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 brandsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | name_asc (default), name_desc, or products_desc (most listed products first). | |
| limit | No | How many to return, 1-25. Default 10. | |
| query | No | Brand name, matched as text. Omit to browse. | |
| offset | No | Skip this many results, for the next page (the answer says which offset comes next). Default 0. | |
| category | No | Only brands with a listed product in this dose form. CARTRIDGE is a vape cartridge. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| total | Yes | How many matched in all; narrow the query when this exceeds the results |
| results | Yes |
TDQS
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.
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.
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.
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.
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.
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 clinicsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cqc | No | CQC rating filter; GOOD_OR_BETTER keeps Good and Outstanding. | |
| near | No | A UK postcode, outcode or town, e.g. "M1 1AE", "LS6" or "Bristol". Sorts nearest first and adds miles. | |
| sort | No | distance (default with `near`), az (default otherwise), za, cheapest / dearest by year-one clinic fees, rating. | |
| limit | No | How many to return, 1-25. Default 10. | |
| query | No | Clinic name, matched as text. For a place use `near`. | |
| offset | No | Skip this many results, for the next page (the answer says which offset comes next). Default 0. | |
| condition | No | 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. | |
| patientType | No | NEW_PATIENT, TRANSFER or ACTIVE_PATIENT. Drops clinics whose policy does not take it, and prices year one for that route. | |
| radiusMiles | No | Only within this many miles of `near`. Ignored without `near`. | |
| consultationType | No | Only clinics offering ONLINE (video), IN_PERSON or PHONE. | |
| acceptingPatients | No | Only clinics showing 'Accepting patients' (an active published policy). | |
| maxFirstConsultationFee | No | Only clinics whose first consultation costs at most this, in GBP. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| total | Yes | How many matched in all; narrow the query when this exceeds the results |
| results | Yes |
TDQS
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.
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.
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.
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.
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.
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 pharmaciesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| near | No | A UK postcode, outcode or town, e.g. "M1 1AE", "LS6" or "Bristol". Sorts nearest first and adds miles. | |
| sort | No | distance (default with `near`), az (default otherwise), za, city, rating. | |
| limit | No | How many to return, 1-25. Default 10. | |
| query | No | Pharmacy name, matched as text. For a place use `near`. | |
| offset | No | Skip this many results, for the next page (the answer says which offset comes next). Default 0. | |
| delivers | No | Only pharmacies that deliver (most dispense UK-wide by post). | |
| minRating | No | Only pharmacies with patient reviews averaging 3+ or 4+. | |
| collection | No | Only pharmacies offering in-person collection. | |
| radiusMiles | No | Only within this many miles of `near`. Ignored without `near`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| total | Yes | How many matched in all; narrow the query when this exceeds the results |
| results | Yes |
TDQS
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.
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.
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.
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.
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.
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 productsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Alphabetical, name_asc (default) or name_desc. | |
| limit | No | How many to return, 1-25. Default 10. | |
| query | No | Product, brand or strain name, e.g. "Pink Kush" or "Tilray". Omit to browse. | |
| offset | No | Skip this many results, for the next page (the answer says which offset comes next). Default 0. | |
| category | No | Dose form. CARTRIDGE is a vape cartridge. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| total | Yes | How many matched in all; narrow the query when this exceeds the results |
| results | Yes |
TDQS
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.
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.
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.
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.
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.
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 strainsARead-onlyIdempotentInspect
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".
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many to return, 1-25. Default 10. | |
| query | No | Strain name or nickname, e.g. "Gelato". Omit to browse. | |
| offset | No | Skip this many results, for the next page (the answer says which offset comes next). Default 0. | |
| genetics | No | The strain type: Indica, Sativa or Hybrid. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| total | Yes | How many matched in all; narrow the query when this exceeds the results |
| results | Yes |
TDQS
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.
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.
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.
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.
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.
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 brandARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | What the slug names: clinic, pharmacy, strain or brand. | |
| slug | Yes | The page slug from a find_* tool or search_findabis, e.g. "green-leaf-clinic". |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| kind | Yes | |
| name | Yes | |
| slug | Yes | |
| brand | No | |
| clinic | No | |
| strain | No | |
| pharmacy | No | |
| description | Yes | |
| descriptionAiAssisted | Yes |
TDQS
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.
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.
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.
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.
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.
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 fullARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The product page slug from find_products or search_findabis, e.g. "demo-kush-t20-c1". |
Output Schema
| Name | Required | Description |
|---|---|---|
| cbd | Yes | |
| thc | Yes | |
| url | Yes | |
| faqs | Yes | |
| form | Yes | Dose form as the page labels it, e.g. "Dried flower" |
| name | Yes | |
| slug | Yes | |
| brand | Yes | |
| image | Yes | |
| dosage | Yes | |
| strain | Yes | |
| storage | Yes | |
| category | Yes | |
| terpenes | Yes | |
| withheld | Yes | |
| allergens | Yes | |
| chemotype | Yes | THC-dominant, CBD-dominant or balanced, from the cannabinoid figures |
| documents | Yes | |
| carrierOil | Yes | |
| priceRange | Yes | Lowest to highest current price across UK pharmacies, naming none; null when not published |
| description | Yes | |
| capsuleShell | Yes | |
| discontinued | Yes | |
| oilFlowerEquivalence | Yes | |
| descriptionAiAssisted | Yes |
TDQS
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.
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.
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.
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.
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.
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 everythingARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Most results per kind, 1-20. Default 8. | |
| query | Yes | What to look for: a name, brand, strain, town or postcode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes |
TDQS
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.
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.
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.
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.
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.
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.
5 tool updates
- Added
find_brands - Changed
find_clinics1 field changed- added
Input schema / properties / offsetAdded 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" +}
- Changed
find_pharmacies1 field changed- added
Input schema / properties / offsetAdded 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" +}
- Changed
find_products1 field changed- added
Input schema / properties / offsetAdded 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" +}
- Changed
find_strains1 field changed- added
Input schema / properties / offsetAdded 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" +}
4 tool updates
- Added
compare_providers - Changed
find_clinics14 fields changed- changed
Input schema / properties / acceptingPatients / descriptionPrevious value: -"Only clinics showing 'Accepting patients' (an active published eligibility policy)."New value: +"Only clinics showing 'Accepting patients' (an active published policy)." - added
Input schema / properties / conditionAdded 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" +} - added
Input schema / properties / consultationTypeAdded value: +{ + "description": "Only clinics offering ONLINE (video), IN_PERSON or PHONE.", + "enum": [ + "ONLINE", + "IN_PERSON", + "PHONE" + ], + "type": "string" +} - added
Input schema / properties / cqcAdded value: +{ + "description": "CQC rating filter; GOOD_OR_BETTER keeps Good and Outstanding.", + "enum": [ + "GOOD_OR_BETTER", + "OUTSTANDING", + "GOOD", + "REQUIRES_IMPROVEMENT", + "NOT_RATED" + ], + "type": "string" +} - added
Input schema / properties / maxFirstConsultationFeeAdded value: +{ + "description": "Only clinics whose first consultation costs at most this, in GBP.", + "exclusiveMinimum": 0, + "type": "number" +} - added
Input schema / properties / nearAdded 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" +} - changed
Input schema / properties / patientType / descriptionPrevious 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." - changed
Input schema / properties / query / descriptionPrevious 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`." - added
Input schema / properties / radiusMilesAdded value: +{ + "description": "Only within this many miles of `near`. Ignored without `near`.", + "exclusiveMinimum": 0, + "maximum": 500, + "type": "number" +} - changed
Input schema / properties / sort / descriptionPrevious 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." - changed
Input schema / properties / sort / enumPrevious value: -[ - "az", - "za", - "priceLowHigh", - "priceHighLow" -]New value: +[ + "distance", + "az", + "za", + "cheapest", + "dearest", + "rating" +] - added
Output schema / properties / results / items / properties / distanceMilesAdded value: +{ + "description": "Miles from `near`; null when no place was given", + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / results / items / properties / firstYearClinicFeesAdded 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" + ] +} - changed
Output schema / properties / results / items / requiredPrevious 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" +]
- Changed
find_pharmacies10 fields changed- added
Input schema / properties / collectionAdded value: +{ + "description": "Only pharmacies offering in-person collection.", + "type": "boolean" +} - changed
Input schema / properties / delivers / descriptionPrevious value: -"Only pharmacies that offer delivery."New value: +"Only pharmacies that deliver (most dispense UK-wide by post)." - added
Input schema / properties / minRatingAdded value: +{ + "description": "Only pharmacies with patient reviews averaging 3+ or 4+.", + "enum": [ + "3_plus", + "4_plus" + ], + "type": "string" +} - added
Input schema / properties / nearAdded 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" +} - changed
Input schema / properties / query / descriptionPrevious 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`." - added
Input schema / properties / radiusMilesAdded value: +{ + "description": "Only within this many miles of `near`. Ignored without `near`.", + "exclusiveMinimum": 0, + "maximum": 500, + "type": "number" +} - changed
Input schema / properties / sort / descriptionPrevious value: -"az (default), za, or by town."New value: +"distance (default with `near`), az (default otherwise), za, city, rating." - changed
Input schema / properties / sort / enumPrevious value: -[ - "az", - "za", - "city" -]New value: +[ + "distance", + "az", + "za", + "city", + "rating" +] - added
Output schema / properties / results / items / properties / distanceMilesAdded value: +{ + "description": "Miles from `near`; null when no place was given", + "type": [ + "number", + "null" + ] +} - changed
Output schema / properties / results / items / requiredPrevious value: -[ - "name", - "slug", - "url", - "city", - "postcode", - "offersDelivery", - "offersCollection", - "rating" -]New value: +[ + "name", + "slug", + "url", + "city", + "postcode", + "distanceMiles", + "offersDelivery", + "offersCollection", + "rating" +]
- Changed
get_listing5 fields changed- added
Output schema / properties / clinic / properties / distanceMilesAdded value: +{ + "description": "Miles from `near`; null when no place was given", + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / clinic / properties / firstYearClinicFeesAdded 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" + ] +} - changed
Output schema / properties / clinic / requiredPrevious 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" +] - added
Output schema / properties / pharmacy / properties / distanceMilesAdded value: +{ + "description": "Miles from `near`; null when no place was given", + "type": [ + "number", + "null" + ] +} - changed
Output schema / properties / pharmacy / requiredPrevious 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" +]
7 tool updates
- Changed
find_clinics9 fields changed- removed
Input schema / properties / acceptingNewPatientsRemoved value: -{ - "description": "Only clinics currently taking new patients.", - "type": "boolean" -} - added
Input schema / properties / acceptingPatientsAdded value: +{ + "description": "Only clinics showing 'Accepting patients' (an active published eligibility policy).", + "type": "boolean" +} - changed
Input schema / properties / limit / descriptionPrevious value: -"Default 10."New value: +"How many to return, 1-25. Default 10." - added
Input schema / properties / patientTypeAdded 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" +} - changed
Input schema / properties / query / descriptionPrevious 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." - added
Input schema / properties / query / maxLengthAdded value: +120 - changed
Input schema / properties / sort / descriptionPrevious value: -"Default az."New value: +"az (default), za, or by published first-year cost: priceLowHigh / priceHighLow." - changed
Input schema / properties / sort / enumPrevious value: -[ - "az", - "priceLowHigh", - "priceHighLow" -]New value: +[ + "az", + "za", + "priceLowHigh", + "priceHighLow" +] - changed
Output 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" +}
- Changed
find_pharmacies6 fields changed- changed
Input schema / properties / delivers / descriptionPrevious value: -"Only pharmacies that deliver."New value: +"Only pharmacies that offer delivery." - changed
Input schema / properties / limit / descriptionPrevious value: -"Default 10."New value: +"How many to return, 1-25. Default 10." - changed
Input schema / properties / query / descriptionPrevious value: -"Name, city or postcode."New value: +"Pharmacy name, town or postcode, matched as text (not by distance). Omit to list all." - added
Input schema / properties / query / maxLengthAdded value: +120 - added
Input schema / properties / sortAdded value: +{ + "description": "az (default), za, or by town.", + "enum": [ + "az", + "za", + "city" + ], + "type": "string" +} - changed
Output 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" +}
- Changed
find_products7 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"Dose form."New value: +"Dose form. CARTRIDGE is a vape cartridge." - changed
Input schema / properties / limit / descriptionPrevious value: -"Default 10."New value: +"How many to return, 1-25. Default 10." - changed
Input schema / properties / query / descriptionPrevious value: -"Product, brand or strain name."New value: +"Product, brand or strain name, e.g. \"Pink Kush\" or \"Tilray\". Omit to browse." - added
Input schema / properties / query / maxLengthAdded value: +120 - changed
Input schema / properties / sort / descriptionPrevious value: -"Default name_asc."New value: +"Alphabetical, name_asc (default) or name_desc." - changed
Input schema / properties / sort / enumPrevious value: -[ - "name_asc", - "price_asc", - "price_desc" -]New value: +[ + "name_asc", + "name_desc" +] - changed
Output 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" +}
- Changed
find_strains6 fields changed- changed
Input schema / properties / genetics / descriptionPrevious value: -"Indica, Sativa or Hybrid."New value: +"The strain type: Indica, Sativa or Hybrid." - added
Input schema / properties / genetics / enumAdded value: +[ + "Indica", + "Sativa", + "Hybrid" +] - changed
Input schema / properties / limit / descriptionPrevious value: -"Default 10."New value: +"How many to return, 1-25. Default 10." - changed
Input schema / properties / query / descriptionPrevious value: -"Strain name."New value: +"Strain name or nickname, e.g. \"Gelato\". Omit to browse." - added
Input schema / properties / query / maxLengthAdded value: +120 - changed
Output 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" +}
- Added
get_listing - Changed
get_product3 fields changed- changed
Input schema / properties / slug / descriptionPrevious 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\"." - added
Input schema / properties / slug / maxLengthAdded value: +200 - changed
Output 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" +}
- Changed
search_findabis4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Default 8 per kind."New value: +"Most results per kind, 1-20. Default 8." - changed
Input schema / properties / query / descriptionPrevious value: -"What to look for."New value: +"What to look for: a name, brand, strain, town or postcode." - added
Input schema / properties / query / maxLengthAdded value: +120 - changed
Output 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" +}
6 tool updates
- First observed
find_clinics - First observed
find_pharmacies - First observed
find_products - First observed
find_strains - First observed
get_product - First observed
search_findabis
Publisher details
- Operator
- Findabis.com · Publisher source
- Operator website
- https://www.findabis.com · Publisher source
- Vendor relationship
- Unknown
- Documentation
- https://www.findabis.com · Publisher source
- Trust center
- Unknown
- Restrictions
- Unknown
Related MCP Connectors
GRADE-rated clinical evidence on cannabis as medicine (DE/EN). Search and cite studies.
MHRA (UK Medicines and Healthcare products Regulatory Agency) — the public products register…
Factual UK ADHD & autism assessment price and wait comparison. Read-only; not medical advice.
Clinical trials, RxNorm drug lookups, FDA drug and device data, PubMed and NHS organisations.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables 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 npmMIT
- AlicenseNot gradedqualityBmaintenanceProvides 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 npmMIT
- AlicenseNot gradedqualityDmaintenanceProvides programmatic access to UK legal documents with hybrid semantic search and Model Context Protocol integration for AI assistants.76MIT

oro-intel-mcpofficial
AlicenseNot gradedqualityDmaintenanceUK public procurement data for AI agents. Tenders, contracts, buyer and supplier profiles over MCP and REST. 250 free credits.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.