Physical ValidationHalmos Labs

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/mcp

Claude Code

claude mcp add --transport http physical-validation https://physicalvalidation.com/mcp

Codex

codex mcp add physical-validation --url https://physicalvalidation.com/mcp

ChatGPT, 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.

ToolWhat it does
search_companiesFree-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_facilitiesLab sites with the same search and filters, each with the claims that matched.
get_companyOne company: sites, published claims with scope, basis and sources, and facts from its own website.
get_facilityOne site: location, claims with sources, and what is unknown.
prepare_requestA 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 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.

FieldMeaning
matchexact: every part of the query matched. partial: nothing matched it all, and these are the closest. none: nothing matched.
correctionA typo the search read as another word.
matchedThe claims that answer the query, each with its scope, basis and source ids.
nextCursorSend 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

LimitWhat the server enforces
Anonymous API60 a minute per client.
MCP600 a minute per IP, and 6000 a minute across all clients. A 429 includes Retry-After.
Authenticated catalogue search120 a minute. The public API does not use this window.
Assistant5 questions a minute and 30 an hour per client.
Quote requests5 sent from the form, a minute per client. Preparing a draft does not send one.
Search textq is at most 500 characters.
Page sizePublic API and MCP: limit from 1 to 50, default 10. Catalogue search: up to 100.
Request bodyPublic 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();
}

Using ChatGPT or Claude apps