Lab results for phthalates and bisphenols in consumer products, plus crowdfunded testing.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Write (treat as a sensitive, purchase-starting action; confirm the product and amount with the person first). Creates a secure Stripe-hosted checkout link for a contribution toward testing one crowdfunding product. Nothing is charged by this call: the person must open checkout_url and pay. Returns the amount, currency, seller, refund terms, and expiry. Use get_checkout_status to see whether they paid.
Crowdfunding product id.
Whole US dollars; must be within the product’s contribution range (minimum $5, or less if less remains).
Optional key; repeating a call with the same key and arguments returns the same checkout instead of a new one.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Write (treat as a sensitive, purchase-starting action; confirm the product and amount with the person first). Creates a secure Stripe-hosted checkout link for a contribution toward testing one crowdfunding product. Nothing is charged by this call: the person must open checkout_url and pay. Returns the amount, currency, seller, refund terms, and expiry. Use get_checkout_status to see whether they paid.
| Argument | Type | Description |
|---|---|---|
| id* | string | Crowdfunding product id. |
| amount* | integer | Whole US dollars; must be within the product’s contribution range (minimum $5, or less if less remains). |
| idempotency_key | string | Optional key; repeating a call with the same key and arguments returns the same checkout instead of a new one. |
{
"type": "object",
"required": [
"id",
"amount"
],
"properties": {
"id": {
"type": "string",
"pattern": "^[1-9][0-9]{0,9}$",
"description": "Crowdfunding product id."
},
"amount": {
"type": "integer",
"maximum": 1995,
"minimum": 1,
"description": "Whole US dollars; must be within the product’s contribution range (minimum $5, or less if less remains)."
},
"idempotency_key": {
"type": "string",
"pattern": "^[A-Za-z0-9_.:-]{8,100}$",
"description": "Optional key; repeating a call with the same key and arguments returns the same checkout instead of a new one."
}
},
"additionalProperties": false
}Write (treat as a sensitive, purchase-starting action; confirm the tier, price, and product links with the person first). Saves a pending testing order and creates a secure Stripe-hosted checkout link for it. Nothing is charged by this call: the person must open checkout_url and pay. Use get_checkout_status to see whether they paid.
| Argument | Type | Description |
|---|---|---|
| tier* | string | Tier id from list_testing_tiers. |
| products* | array | Products to test (at most the tier’s product count), each a public http(s) product page. |
| idempotency_key | string | Optional key; repeating a call with the same key and arguments returns the same checkout. |
{
"type": "object",
"required": [
"tier",
"products"
],
"properties": {
"tier": {
"enum": [
"single",
"kitchen",
"pantry"
],
"type": "string",
"description": "Tier id from list_testing_tiers."
},
"products": {
"type": "array",
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"maxLength": 2048,
"description": "Product page URL."
},
"notes": {
"type": "string",
"maxLength": 500,
"description": "Optional size/variant hint."
}
},
"additionalProperties": false
},
"maxItems": 10,
"minItems": 1,
"description": "Products to test (at most the tier’s product count), each a public http(s) product page."
},
"idempotency_key": {
"type": "string",
"pattern": "^[A-Za-z0-9_.:-]{8,100}$",
"description": "Optional key; repeating a call with the same key and arguments returns the same checkout."
}
},
"additionalProperties": false
}Check whether a checkout created by this connector is awaiting payment, paid, processing, or expired. Report "paid" only when this returns paid. Read-only.
| Argument | Type | Description |
|---|---|---|
| checkout_id* | string | checkout_id returned by a checkout tool. |
{
"type": "object",
"required": [
"checkout_id"
],
"properties": {
"checkout_id": {
"type": "string",
"pattern": "^cs_(live|test)_[A-Za-z0-9]{10,200}$",
"description": "checkout_id returned by a checkout tool."
}
},
"additionalProperties": false
}Get live funding status for one crowdfunding product id: goal, funded, remaining, allowed contribution range, and the result link once tested. Read-only.
| Argument | Type | Description |
|---|---|---|
| id* | string | Crowdfunding product id from search_crowdfund. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"pattern": "^[1-9][0-9]{0,9}$",
"description": "Crowdfunding product id from search_crowdfund."
}
},
"additionalProperties": false
}Get the full public record for one result id from search_results: provenance, every sample with its lot and analyses, every analyte measurement with its status, LOQ where known, and Laboratory.love’s per-serving exposure ratings with their assumptions. When answering: name the source (commissioned vs PlasticList-derived), keep detected / below_limit_of_quantitation / not_detected / not_tested distinct, give sample counts, and do not call a product safe because values are low or not detected. Read-only.
| Argument | Type | Description |
|---|---|---|
| id* | string | Result id such as "cf-116" or "pl-72". |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"pattern": "^(cf-[1-9][0-9]{0,9}|pl-[0-9]{1,10})$",
"description": "Result id such as \"cf-116\" or \"pl-72\"."
}
},
"additionalProperties": false
}List the chemicals Laboratory.love reports (abbreviations such as DEHP, DBP, BPA, BPS), their categories, lab panels, and how each feeds the exposure ratings. Use it to explain abbreviations or to pick an analyte filter. Read-only.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List the direct testing packages a person can buy to have Laboratory.love test products they choose: price, number of products, samples, panels, turnaround, and refund terms. Read-only.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List products the public can fund toward laboratory testing, with goal, amount funded, amount remaining, and status. Defaults to products currently accepting contributions. Read-only.
| Argument | Type | Description |
|---|---|---|
| q | string | Words to match in the product name or brand. |
| limit | integer | |
| cursor | string | next_cursor from a previous call with the same filters. |
| status | string | Defaults to accepting_contributions. |
{
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 100,
"description": "Words to match in the product name or brand."
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1
},
"cursor": {
"type": "string",
"maxLength": 200,
"description": "next_cursor from a previous call with the same filters."
},
"status": {
"enum": [
"accepting_contributions",
"funded",
"testing_in_progress",
"tested",
"all"
],
"type": "string",
"description": "Defaults to accepting_contributions."
}
},
"additionalProperties": false
}Search Laboratory.love’s published product-test records. Use this before answering whether a product, brand, or category has been tested. Records are either Laboratory.love-commissioned tests or clearly labeled PlasticList-derived historical records; report which. Results describe the samples tested, not every unit of a product. Covers chemicals that come from plastics (phthalates, BPA and other bisphenols, and phthalate substitutes), the usual meaning of "plastic chemicals" in food; it does not measure microplastic particles, so say so if someone asks about microplastics. Read-only.
| Argument | Type | Description |
|---|---|---|
| q | string | Words to match in the product name, brand, category, or tags, e.g. "Coca-Cola Zero" or "tofu". |
| tag | string | A PlasticList source tag such as "sodas" or "baby_food". |
| sort | string | Defaults to relevance when q is given, otherwise tested_on_desc. |
| brand | string | Brand words. PlasticList records have no separate brand field, so this also matches their product name. |
| limit | integer | |
| cursor | string | next_cursor from a previous call with the same filters. |
| source | string | Only commissioned (Laboratory.love-commissioned) or plasticlist_derived records. |
| analyte | string | Analyte abbreviation or name from list_analytes, e.g. DEHP or BPA. Keeps only results where it was measured. |
| category | string | Category slug. |
| detected | boolean | With analyte: true keeps results where that analyte was detected in at least one sample; false keeps results where it was measured but never detected. Without analyte: any analyte. |
{
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 100,
"description": "Words to match in the product name, brand, category, or tags, e.g. \"Coca-Cola Zero\" or \"tofu\"."
},
"tag": {
"type": "string",
"maxLength": 60,
"description": "A PlasticList source tag such as \"sodas\" or \"baby_food\"."
},
"sort": {
"enum": [
"relevance",
"tested_on_desc",
"tested_on_asc",
"name_asc"
],
"type": "string",
"description": "Defaults to relevance when q is given, otherwise tested_on_desc."
},
"brand": {
"type": "string",
"maxLength": 60,
"description": "Brand words. PlasticList records have no separate brand field, so this also matches their product name."
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1
},
"cursor": {
"type": "string",
"maxLength": 200,
"description": "next_cursor from a previous call with the same filters."
},
"source": {
"enum": [
"commissioned",
"plasticlist_derived"
],
"type": "string",
"description": "Only commissioned (Laboratory.love-commissioned) or plasticlist_derived records."
},
"analyte": {
"type": "string",
"maxLength": 60,
"description": "Analyte abbreviation or name from list_analytes, e.g. DEHP or BPA. Keeps only results where it was measured."
},
"category": {
"enum": [
"beverages",
"water",
"fast-food-and-restaurants",
"prepared-meals",
"baby-food-and-formula",
"produce-and-meat",
"milk-and-dairy",
"supplements-and-protein",
"pantry",
"personal-care-and-non-food"
],
"type": "string",
"description": "Category slug."
},
"detected": {
"type": "boolean",
"description": "With analyte: true keeps results where that analyte was detected in at least one sample; false keeps results where it was measured but never detected. Without analyte: any analyte."
}
},
"additionalProperties": false
}