Find My Farmer

Find Canadian farms that sell direct — what they grow and raise, where, when, and at what price.

Should I use this

Quality & Safety

A
Description quality
95%
Schema completeness
87%
Naming quality
93%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (1)

  • LOWTool 'compare' description lacks action verbin compare

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,353Tokens (tool definitions)
~986 BTypical response size
Moderate attention impact (1.84% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "farms": {
      "url": "https://findmyfarmer.ca/mcp"
    }
  }
}

Remote endpoints

https://findmyfarmer.ca/mcpstreamable-http

What it can do

Tool inventory

Tools (15)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢search_farms(query, province, page)

Search the Find My Farmer registry of local farms in Canada. Returns farm name, location (city/province), type, and the canonical findmyfarmer.ca page URL. Search matches farm names, stories, and what each farm sells (goods, packages, events).

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Free-text search, e.g. \"beef\", \"sourdough\", \"farm stays\". Omit to list farms."
    },
    "province": {
      "type": "string",
      "description": "Two-letter province/state code filter, e.g. \"AB\", \"BC\", \"MT\"."
    },
    "page": {
      "type": "integer",
      "minimum": 1,
      "description": "Page number (10 results per page)."
    }
  }
}
🟢get_farm(slug)

Fetch one farm's full public profile by its URL slug (the last path segment of a findmyfarmer.ca/farms/... URL, also returned by search_farms). Includes the farm story, contact channels the farmer chose to publish, and how to buy from them. Volume-capped: 50 profiles per caller per UTC day — this registry serves reference use and does not offer bulk datasets.

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "description": "The farm's URL slug, e.g. \"po-s-broccoli-patch\"."
    }
  },
  "required": [
    "slug"
  ]
}
🟢search_farmdex(query)

Search the Farmdex — Find My Farmer's agricultural knowledge database of categories, species, and variants (e.g. heritage vegetable varieties, livestock breeds). Useful for resolving what a food product actually is before searching for farms that sell it.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "e.g. \"brandywine tomato\", \"highland cattle\"."
    }
  },
  "required": [
    "query"
  ]
}
🟢list_hubs(province)

List Find My Farmer hubs — the named local-food regions (foodsheds) farms dock into. Useful for narrowing a farm search to a place.

Input Schema

{
  "type": "object",
  "properties": {
    "province": {
      "type": "string",
      "description": "Two-letter province/state code filter, e.g. \"AB\"."
    }
  }
}
🟢find_near(lat, lng, place, radius_km, species, ...)

Farms AND coordination points (farmers' markets, off-farm pickup points, stockists) within a radius of a point or a named place, ordered by distance, optionally filtered by what is sold (species ids or a good slug), a farming practice, a service category, or an event type. Points carry their schedule and the farms present. Distances are straight-line from each farm's PUBLIC map point, or pass distance="road" for cached driving distance + minutes (cold pairs are filled once per call, capped). This is the "where can I get X near here — and where on Saturday" primitive.

Input Schema

{
  "type": "object",
  "properties": {
    "lat": {
      "type": "number",
      "description": "Latitude of the centre. Pass lat+lng OR place."
    },
    "lng": {
      "type": "number",
      "description": "Longitude of the centre."
    },
    "place": {
      "type": "string",
      "description": "A place slug from list_places, e.g. \"calgary\", \"alberta/calgary\" or \"alberta\". Its centroid becomes the centre and its reach the default radius."
    },
    "radius_km": {
      "type": "number",
      "minimum": 1,
      "maximum": 300,
      "description": "Search radius in km (default: the place's reach, else 50; max 300)."
    },
    "species": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "species ids (from search_farmdex / get_place_catalogue), OR-matched, e.g. [\"cattle-taurus\"]."
    },
    "good": {
      "type": "string",
      "description": "A goods slug from list_goods (e.g. \"grass-fed-beef\") — expands to its species and practice scope."
    },
    "practices": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "farming practice ids from list_filters, e.g. [\"rotationalGrazing\"]."
    },
    "service_categories": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "service category slugs from list_filters, e.g. [\"hay-feed-forage\"]."
    },
    "event_types": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "event type slugs from list_filters, e.g. [\"berry-picking\"]."
    },
    "distance": {
      "type": "string",
      "enum": [
        "straight",
        "road"
      ],
      "description": "straight (default) = geodesic from the public point. road = driving km + minutes from the shared 90-day cache; a bounded number of cold pairs are routed fresh per call, the rest carry straight-line only until warmed. Maps-hidden farms never carry road figures."
    },
    "include": {
      "type": "string",
      "enum": [
        "both",
        "farms",
        "points"
      ],
      "description": "What to return: farms, points (markets / pickups / stockists), or both (default)."
    },
    "kinds": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "market",
          "pickup",
          "retail"
        ]
      },
      "description": "Point kinds to include (default all)."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50,
      "description": "Results per page, applied to farms and points separately (default 25)."
    },
    "page": {
      "type": "integer",
      "minimum": 1,
      "description": "Page number."
    }
  }
}
🟢price_stats(good, province)

Aggregate price statistics (low / median / mean / high, farm + observation counts, as-of dates) for a good, nationally or in one province, from Find My Farmer's price ledger. Every bucket covers at least 3 farms and no price is attributed to a farm — this is the public, unattributable side of the FARM-VOICE price rule.

Input Schema

{
  "type": "object",
  "properties": {
    "good": {
      "type": "string",
      "description": "A goods slug from list_goods, e.g. \"grass-fed-beef\", \"raw-honey\"."
    },
    "province": {
      "type": "string",
      "description": "Province slug (\"alberta\"), code (\"AB\") or name. Omit for national."
    }
  },
  "required": [
    "good"
  ]
}
🟢whats_in_season(province, month)

Species in their harvest window in a Canadian province for a given month (default: this month), with how many local published farms list each. Window-based (is the month inside start..end), not peak-based.

Input Schema

{
  "type": "object",
  "properties": {
    "province": {
      "type": "string",
      "description": "Province slug (\"ontario\"), code (\"ON\") or name."
    },
    "month": {
      "type": "integer",
      "minimum": 1,
      "maximum": 12,
      "description": "Month number 1–12. Default: current month (UTC)."
    }
  },
  "required": [
    "province"
  ]
}
🟢get_place_catalogue(province, metro)

Everything available near a place — every species that published farms serving the place list, in taxonomy shape (category → subcategory → species) with local farm counts — plus the place's Wikidata / GeoNames ids.

Input Schema

{
  "type": "object",
  "properties": {
    "province": {
      "type": "string",
      "description": "Province slug, e.g. \"alberta\"."
    },
    "metro": {
      "type": "string",
      "description": "Metro slug under that province, e.g. \"calgary\". Omit for the whole province."
    }
  },
  "required": [
    "province"
  ]
}
🟢list_places(country, province)

The place graph: countries and provinces/states (no args), one country's provinces (country), or one province's metros (province). Each place carries its slug, centroid, reach, and Wikidata / GeoNames identifiers.

Input Schema

{
  "type": "object",
  "properties": {
    "country": {
      "type": "string",
      "description": "ISO 3166-1 alpha-2, e.g. \"CA\"."
    },
    "province": {
      "type": "string",
      "description": "Province slug, e.g. \"alberta\" — returns its metros."
    }
  }
}
🟢get_species(species)

One Farmdex species: names, taxonomy, description, its GBIF / Wikidata / ITIS identifiers, and its varieties or breeds. Resolve a food name to a species id first with search_farmdex.

Input Schema

{
  "type": "object",
  "properties": {
    "species": {
      "type": "string",
      "description": "species id, e.g. \"cattle-taurus\", \"garlic\"."
    }
  },
  "required": [
    "species"
  ]
}
🟢define_term(term)

Find My Farmer's definition of a farming practice (rotational grazing, grass-finished, no-till…): the meaning, the nuance, the questions to ask a farmer, FAQs, and how many farms claim it. Returns the term's stable IRI.

Input Schema

{
  "type": "object",
  "properties": {
    "term": {
      "type": "string",
      "description": "Practice slug (\"rotational-grazing\") or id (\"rotationalGrazing\"). An unknown term returns the full list."
    }
  },
  "required": [
    "term"
  ]
}
🟢list_goods

The goods Find My Farmer publishes reports and price statistics for — the slugs price_stats and find_near accept, each with the species and practices that define it.

Input Schema

{
  "type": "object",
  "properties": {}
}
🟢list_filters

The controlled vocabularies find_near accepts: farming practice ids, service category slugs, event type slugs.

Input Schema

{
  "type": "object",
  "properties": {}
}
⚪best_for(species, use, limit)

The best varieties of a species for a use — "best apple varieties for baking" — ranked from the Farmdex's documented tasting notes and trait spectra (1–5, relative to the species' reference variety). Pass species + use for the ranked answer; species alone lists the uses it can answer; use alone lists the species with an answer. A guide exists only once at least 3 documented varieties carry the use.

Input Schema

{
  "type": "object",
  "properties": {
    "species": {
      "type": "string",
      "description": "species id from search_farmdex, e.g. \"apple\", \"tomato\"."
    },
    "use": {
      "type": "string",
      "description": "a best-uses token, e.g. \"baking\", \"canning\", \"fresh eating\", \"juicing\"."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "description": "Max varieties returned (default 25); the url carries the full guide."
    }
  }
}
🔴compare(a, b)

Two Farmdex varieties head to head — "Honeycrisp vs Gala": documented tasting prose, uses, and (same species) 1–5 trait values on shared axes relative to the species' reference variety. Both variants must clear a completeness bar (description + >= 2 documented sensory/use fields). Machine-only — there is deliberately no compare page family; cite the two variety URLs returned.

Input Schema

{
  "type": "object",
  "properties": {
    "a": {
      "type": "string",
      "description": "first variant id, e.g. \"apple-honeycrisp\" (from search_farmdex / best_for)."
    },
    "b": {
      "type": "string",
      "description": "second variant id, e.g. \"apple-gala\"."
    }
  },
  "required": [
    "a",
    "b"
  ]
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded15 tools