Connect the MCP server
Updated
Connect by URL. Tools: search_companies, search_facilities, get_company, get_facility, prepare_request. Reads need no token.
See also Draft experiment requests by API and Fast-turnaround assay outsourcing.
Server URL
https://physicalvalidation.com/mcpClaude Code
claude mcp add --transport http physical-validation https://physicalvalidation.com/mcpCodex
codex mcp add physical-validation --url https://physicalvalidation.com/mcpChatGPT, Claude, Cursor, and Grok
Connect by URL. In ChatGPT: Plugins → + → Add custom MCP server. Paste the MCP URL. Business, Enterprise, and Edu plans need an admin to allow a custom MCP server.
Claude, Cursor, and Grok each take the same URL as a custom MCP server.
Tools
Every tool is read-only: it stores nothing and contacts no one. Each declares an output schema and returns structured content, with the same JSON as text for older clients.
| Tool | What it does |
|---|---|
search_companies | Free-text search ("peptides", "GLP bioanalysis", a company name) with the site's search and vocabulary, and what matched. Filters: country, region, providerType, service, modality, quality, equipment. |
search_facilities | Lab sites with the same search and filters, each with the claims that matched. |
get_company | One company: sites, published claims with scope, basis and sources, and facts from its own website. |
get_facility | One site: location, claims with sources, and what is unknown. |
prepare_request | A request draft placed with the site's vocabulary, and a physicalvalidation.com link where the person reviews it, adds contact details and sends it. Nothing is stored or sent. Contact details are not accepted. |
Search
Search is free text first: put the need in q the way the person said it, such as peptides, LNP formulation or a company name. The site's vocabulary reads synonyms, plurals and small typos, and each result lists the claims or website facts that matched, with their sources. Add country (ISO codes), region (europe, north-america, asia-pacific, latin-america, middle-east-africa) or providerType when the person names a place or a kind of provider. Set facets: true to get exact values for service, modality, quality and equipment.
| Field | Meaning |
|---|---|
match | exact: every part of the query matched. partial: nothing matched it all, and these are the closest. none: nothing matched. |
correction | A typo the search read as another word. |
matched | The claims that answer the query, each with its scope, basis and source ids. |
nextCursor | Send it back as cursor with the same query for the next page. A STALE_CURSOR error means the data changed: search again. |
Details and evidence
get_company and get_facility return claims with their scope (a site's own, or the organization's), basis and sourceIds into sources. Facts read from a company's website carry the page they came from. A claim does not establish availability or suitability.
The same records are resources: physical-validation://company/{id} and physical-validation://facility/{id}. Search results link to them. There is no resource list; find records with search.
Requests
prepare_request places the person's words with the site's vocabulary, as the site's own assistant does, and returns a link to the request form with the draft filled in. The person checks it, adds their contact details, agrees to the terms and sends it. An agent cannot send a request: the request API accepts only the site's form, and the tool takes no contact details.
The draft travels in the link's fragment, which browsers leave off the request, so nothing is stored until the person sends it.
Errors
A failed tool call returns isError with {"error":{"code":"…","message":"…","retryable":…}} as structured content. An unknown resource is a JSON-RPC -32602 error. Past a limit, the server answers HTTP 429 with Retry-After.
Limits
| Limit | What the server enforces |
|---|---|
| Anonymous API | 60 a minute per client. |
| MCP | 600 a minute per IP, and 6000 a minute across all clients. A 429 includes Retry-After. |
| Authenticated catalogue search | 120 a minute. The public API does not use this window. |
| Assistant | 5 questions a minute and 30 an hour per client. |
| Quote requests | 5 sent from the form, a minute per client. Preparing a draft does not send one. |
| Search text | q is at most 500 characters. |
| Page size | Public API and MCP: limit from 1 to 50, default 10. Catalogue search: up to 100. |
| Request body | Public API JSON: 65536 bytes. MCP message: 100000 bytes. The shared JSON reader, used by site search POST: 16384 bytes. |
Past a limit the response is HTTP 429 and includes Retry-After, in seconds. Wait that long, then retry. For the API, MCP, catalogue search, and quote requests the value is 60. For the assistant it is 60 on the per-minute cap and 3600 on the hourly cap.
Versions
Streamable HTTP, protocol 2026-07-28, with the 2025 revisions (2025-11-25, 2025-06-18, 2025-03-26) served statelessly. The tool contract is version 2.0.0, reported as the server version. Tools keep their names. New inputs are optional and results only gain fields.
Publisher
Halmos Labs publishes this server. Privacy, terms, and support are on this site. Questions: inquiry@physicalvalidation.com.
TypeScript client
The MCP SDK negotiates the protocol version. This example uses @modelcontextprotocol/client.
import { Client, StreamableHTTPClientTransport }
from "@modelcontextprotocol/client";
const client = new Client({
name: "research-client",
version: "1.0.0",
});
try {
await client.connect(
new StreamableHTTPClientTransport(
new URL("https://physicalvalidation.com/mcp"),
),
);
const result = await client.callTool({
name: "search_companies",
arguments: { q: "protein", limit: 5 },
});
console.log(result.structuredContent);
} finally {
await client.close();
}