Physical ValidationHalmos Labs

Using Physical Validation from an agent

Connect by URL, or let the browser's own agent drive the page. Reads need no token. An agent can search and read. It cannot send a request or contact a supplier.

Connect over MCP

The server is Streamable HTTP. Add it in the client by URL. No account is needed. A stray Authorization header is ignored.

https://physicalvalidation.com/mcp

In Claude Code:

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

ChatGPT, Claude, Cursor, and Grok each take the same URL as a custom MCP server. Setup for each one is on the MCP page. The same five tools are an HTTP API: API reference, API index, OpenAPI, llms.txt.

The tools are search_companies, search_facilities, get_company, get_facility, and prepare_request. Search takes the need in the person's words. prepare_request returns a link on this site. The person checks it, adds contact details, agrees, and sends it. The tool stores nothing and contacts no one.

WebMCP in the browser

On a browser that supports WebMCP, every page registers tools for the visitor's own agent. They do what a person could do here, and the reading ones move the page, so the person sees what their agent does. None of them submits a form.

ToolWhat it does
search_directorySearch the directory and show the results on this page.
list_categoriesList categories and filter values, with how many companies have each.
get_current_pageDescribe the search, the companies listed, or the company or site on screen.
open_companyOpen a company and return what it offers and its sites.
open_siteOpen one site and return its services, standards, equipment, and sources.
ask_physical_validationAsk the on-page assistant. The answer streams into the panel, where the person can continue it.
start_quote_requestOpen the request form. The person reviews and sends it. The tool never submits it.

What an agent can do

  • Search companies and sites by what they do, where they are, and by name.
  • Read one company or one site, including published claims and the sources behind them.
  • Prepare a request draft and hand the person a link to review and send.
  • In the browser: search, open a company or a site, ask the assistant, and open the request form.

What an agent cannot do

  • Send a request, or contact a supplier. The request API accepts only the site's form, after the person consents.
  • Submit the request form. start_quote_request and prepare_request stop at the person.
  • Read captured third-party page text, or call admin tools. Those stay behind access control and are not in the public tool list.
  • Scrape, mirror, or redistribute the catalogue. That is prohibited by the terms of use.

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.

Examples

Search from a shell:

curl --fail-with-body 'https://physicalvalidation.com/api/v1/companies?q=peptides&region=europe&limit=5'

Prepare a draft. The result's review.url is the link the person opens:

curl --fail-with-body 'https://physicalvalidation.com/api/v1/request-drafts' \
  -H 'Content-Type: application/json' \
  -d '{"title":"GMP peptide, 50 g","services":["peptide synthesis"],"quality":["GMP"]}'

In the browser, a WebMCP call that searches and moves the page:

search_directory({ "query": "GMP peptide", "region": ["europe"] })