canonical_url gives the agent a human-readable CompatAir page to cite.
Data infrastructure for AI agents
CompatAir MCP
A public, deterministic and read-only MCP server for identifying pneumatic products, checking compatibility, building complete systems and tracing every decision back to evidence. The agent orchestrates. The documented engine decides the verdict.
- Endpoint
https://compatair.fr/mcp- Transport
- Streamable HTTP · JSON-RPC 2.0
- Main surface
- 7 decision-core tools · 12.8 KB measured
- Contracts
- MCP 3.0.0 · verdicts 2.0.0 · method 2026.07
- Dataset scope
- 22,400 explorable · 20,860 fixed verdicts
- Authentication
- None · public data · read-only
The verifiable difference
A technical decision service, not a conversational wrapper
CompatAir never asks a language model to guess whether two products work together. The server returns inputs, method, verdict, limitations, evidence and the matching web page in a structured response.
22,400 combinations are explorable, not precomputed. The snapshot contains 20,860 audited verdicts for 149 fixed-flow tools. The remaining 1,540 combinations require an action rate or volume and target time. Machine data also publishes normalized MPNs, EAN/GTIN, evidenced distributor SKUs, field-level coverage, source roles and the data freshness SLA.
insufficient_data.source_urls identifies the documents used. It does not replace the canonical result page.
Prices and availability use separate tools. Commission cannot create or change a verdict.
Method, catalog and observation dates travel with each result and appear in the changefeed.
Products and configurations receive a CompatAir ID independent of the displayed commercial name.
Seven tools form the decision-core profile. Four advanced tools and nine legacy tools live on separate endpoints.
Quickstart
Test the protocol without an SDK
These requests use the current Streamable HTTP transport. Each JSON-RPC message is sent in a new POST and advertises both response media types required by the protocol.
1 · Initializecurl
curl --request POST 'https://compatair.fr/mcp' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json, text/event-stream' \
--data '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-11-25",
"capabilities": {},
"clientInfo": { "name": "example-client", "version": "1.0.0" }
}
}'2 · Discover toolscurl
curl --request POST 'https://compatair.fr/mcp' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json, text/event-stream' \
--header 'MCP-Protocol-Version: 2025-11-25' \
--data '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'3 · Identify a product by EANcurl
curl --request POST 'https://compatair.fr/mcp' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json, text/event-stream' \
--header 'MCP-Protocol-Version: 2025-11-25' \
--data '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "identify_product",
"arguments": { "ean": "4006825660630" }
}
}'The server is stateless at the protocol layer and returns JSON responses. A GET /mcp therefore receives 405 Method Not Allowed, which is the specified behavior when the server does not expose a server-initiated SSE stream.
Verified integrations
ChatGPT, Claude, Gemini and agent SDKs
The endpoint is identical in every client. Configuration vocabulary, permissions and execution location are the only differences.
ChatGPT
- In ChatGPT, open Settings → Security and login, then turn on Developer mode.
- Open Settings → Plugins or chatgpt.com/plugins, select the + button and create a developer-mode app using
https://compatair.fr/mcp. The CompatAir server does not require authentication. - In a new chat, select the app and test a positive case, an incompatible case and an
insufficient_datacase. Repeat the check in Deep Research when that surface is available in your workspace.
Menus and permissions depend on the plan and workspace policy. Before publishing, an administrator should review permissions and tool changes.
Official reference: OpenAI · Connect in ChatGPT.
Claude Code
CLI installation
HTTP is the recommended transport for remote MCP servers.
claude mcp add --transport http compatair https://compatair.fr/mcp
claude mcp get compatair
# In Claude Code: /mcpProject .mcp.json
Claude Code asks for project trust before using this configuration.
{
"mcpServers": {
"compatair": {
"type": "http",
"url": "https://compatair.fr/mcp"
}
}
}Use --scope project to share the configuration. streamable-http is also accepted as an alias of http. Official reference: Connect Claude Code to tools via MCP.
Gemini Interactions API
Remote MCP in the Interactions API accepts Streamable HTTP servers and can restrict the exposed surface with allowed_tools.
Python
from google import genai
client = genai.Client()
interaction = client.interactions.create(
model="gemini-3.5-flash",
input="Is this impact wrench compatible with my compressor?",
tools=[{
"type": "mcp_server",
"name": "compatair",
"url": "https://compatair.fr/mcp",
}],
)
print(interaction.output_text)JavaScript
import { GoogleGenAI } from '@google/genai';
const client = new GoogleGenAI({});
const interaction = await client.interactions.create({
model: 'gemini-3.5-flash',
input: 'Build a documented compressed-air system for this tool.',
tools: [{
type: 'mcp_server',
name: 'compatair',
url: 'https://compatair.fr/mcp',
}],
});
console.log(interaction.output_text);Check currently supported models in Google’s Gemini Remote MCP documentation.
OpenAI Agents SDK
In Python, HostedMCPTool lets the Responses API call the public server. In JavaScript, MCPServerStreamableHttp connects the application process directly to it.
Python · Hosted MCP
import asyncio
from agents import Agent, HostedMCPTool, Runner
async def main() -> None:
agent = Agent(
name="Compressed air advisor",
instructions=(
"Preserve verdict, limitations and source_urls. "
"Always cite canonical_url."
),
tools=[HostedMCPTool(tool_config={
"type": "mcp",
"server_label": "compatair",
"server_url": "https://compatair.fr/mcp",
"require_approval": "never",
})],
)
result = await Runner.run(agent, "Explain this CompatAir verdict")
print(result.final_output)
asyncio.run(main())JavaScript · direct connection
import { Agent, MCPServerStreamableHttp, run } from '@openai/agents';
const server = new MCPServerStreamableHttp({
name: 'CompatAir',
url: 'https://compatair.fr/mcp',
cacheToolsList: true,
});
await server.connect();
try {
const agent = new Agent({
name: 'Compressed air advisor',
instructions: 'Preserve limitations and cite canonical_url.',
mcpServers: [server],
});
const result = await run(agent, 'Build a documented complete air system.');
console.log(result.finalOutput);
} finally {
await server.close();
}Official references: Python Agents SDK and JavaScript Agents SDK.
Agent-to-user contract
Every result is verifiable and citable
Every tool publishes an outputSchema. Results are returned both as structuredContent and as serialized JSON in a text block for older clients.
{
"verdict": "insufficient_data",
"verdict_scope": "complete_air_system",
"verdict_schema_version": "2.0.0",
"overall_system_verdict": {
"schema_version": "2.0.0",
"scope": "complete_air_system",
"verdict": "insufficient_data",
"limitations": ["Network components remain unverified."]
},
"air_supply_verdict": {
"schema_version": "2.0.0",
"scope": "air_supply",
"verdict": "compatible",
"engine_verdict": "continuous",
"limitations": []
},
"canonical_url": "https://compatair.fr/calculateur/?outil=...&compresseur=...",
"product_urls": [],
"source_urls": [],
"method_version": "2026.07",
"catalog_version": "2026-07-15",
"observed_at": "2026-07-15",
"limitations": [],
"next_actions": []
}| Field | Purpose | Agent rule |
|---|---|---|
verdict | Normalized technical state. | Never upgrade or soften it. |
verdict_scope | Scope of the backward-compatible root verdict. | Never extend it to another scope. |
overall_system_verdict | Complete-system verdict, including the distribution network. | Keep it distinct from air-supply capacity. |
air_supply_verdict | Pressure, FAD and duty-cycle decision under air_supply. | Never present it as complete-system validation. |
compatibility_receipt | Versioned SHA-256-verifiable receipt. | Retain it with audited or shared decisions. |
canonical_url | CompatAir page for this result. | Cite or offer it to the user. |
product_urls | Relevant product pages. | Use them for product context. |
source_urls | Evidence documents used. | Preserve claim-to-source links. |
method_version | Calculation contract version. | Retain it in caches and traces. |
catalog_version | Technical snapshot queried. | Compare it through the changefeed. |
observed_at | Snapshot observation date. | Do not present it as real-time data. |
limitations | Missing data and result boundaries. | Expose all of them. |
next_actions | Safe checks or next pages. | Only suggest actions returned by the server. |
canonical_url is the CompatAir reference. source_urls contains the documents supporting the data. Merging these two layers would break traceability.
MCP 3.0.0 surface
A short main surface and two explicit extensions
A general client ingests seven compact schemas. Exhaustive contracts remain available from compatair://responses/schema. Audit and synchronization tools use the extended profile; historical contracts use legacy.
| Profile | Endpoint | Use |
|---|---|---|
| decision-core | https://compatair.fr/mcp | Orientation, identification, decision, complete system, alternatives, corpus and offers. |
| extended | https://compatair.fr/mcp/extended | Detailed evidence, explanations, complete comparisons and changefeed. |
| legacy | https://compatair.fr/mcp/legacy | Temporary migration surface for nine historical tools. |
| AirGraph tool | Capability |
|---|---|
orient_decision | Returns the smallest suitable tool and profile when the next action is unclear. |
evaluate_air_compatibility | Exposes the fr.compatair.air.compatibility UCP capability for intent-based transaction enrichment without touching checkout state. |
identify_product | Matches a name, URL, EAN/GTIN, MPN, evidenced distributor SKU, reference or CompatAir ID without fetching the supplied URL. |
build_complete_air_system | Assembles compressor, tools, hose, connectors, filtration and lubrication from documented requirements only. |
explain_compatibility_verdict | Breaks down pressure, flow, duty cycle and missing-data factors. |
find_compatible_alternatives | Returns the smallest verified compressor substitution without commission-based ordering. |
compare_complete_systems | Compares two to five technical configurations without a commercial score. |
get_compatibility_evidence | Returns the specifications, references and AirGraph edges used by one verdict. |
search_knowledge | Searches guides, glossary, methods and product pages within the published CompatAir corpus. |
get_current_offers | Returns fresh allowlisted commercial observations separately from the technical verdict. |
get_changefeed | Reports visible method, catalog and offer versions since a supplied date or version. |
Recommended decision-core profile
A general integration loads only these seven tools. The profile, endpoints and legacy successors are also available at compatair://tools/core-profile.
orient_decisionidentify_productevaluate_air_compatibilitybuild_complete_air_systemfind_compatible_alternativessearch_knowledgeget_current_offers
Advanced tools loaded on demand
get_compatibility_evidenceexplain_compatibility_verdictcompare_complete_systemsget_changefeed
Maintained legacy tools
They remain available from https://compatair.fr/mcp/legacy, but each definition carries fr.compatair/lifecycle=legacy and an explicit fr.compatair/successor.
search_toolsget_tool_requirementssearch_compressorsget_compressor_specssize_compressorcheck_compatibilitycompare_compressorsfind_accessoriesfind_offers
Context resources
compatair://catalog/versioncompatair://methodologycompatair://tools/taxonomycompatair://confidence-scalecompatair://affiliation-policycompatair://engine/versioncompatair://airgraph/schemacompatair://responses/schemacompatair://tools/core-profilecompatair://receipts/schemacompatair://changefeed/current
Reusable prompts
choisir_un_compresseurauditer_une_installationcomparer_des_configurations
Sector data model
AirGraph connects demand, distribution and evidence
The graph does more than connect one tool to one compressor. It models technical requirements, distribution components, verdicts and evidence under stable identifiers.
ca:compressor:<id> and ca:tool:<id>.
ca:configuration:<digest> depends on the compressor, sorted tools and usage mode.
ca:requirement:<id> carries a documented pressure, flow or component fact.
A missing requirement remains missing. CompatAir does not infer pressure drop from an unknown hose and never converts intake displacement into FAD. The graph also records this absence in limitations.
Decisions can be frozen into a compatibility_receipt. Response fidelity is measurable with the public 100-scenario benchmark. MCP profile and tool selection are tested separately with the 50-request agent-selection suite, without publishing a score before execution through real models and tokenizers. Evidence changes are mapped to portfolios through the Compatibility Impact Feed.
Trust boundary
A public server designed to limit its own power
The service’s strongest defense is its narrow scope. CompatAir MCP cannot modify state, accepts no secrets, fetches no user-supplied URL and exposes neither the proprietary engine nor the filesystem.
| Risk | Enforced control |
|---|---|
| DNS rebinding and browser calls | Loopback binding behind the HTTPS proxy. A present Origin must be allowlisted or the server returns 403. |
| SSRF | identify_product parses identifiers and URL segments only. It never downloads remote content. |
| Tool abuse | All tools are functionally read-only. MCP annotations describe this, while the server enforces it. |
| Oversized input | 64 KiB body limit, 2,048-character URL limit, bounded fields, arrays, cursors and identifiers. |
| Basic denial of service | 120 requests per minute per client address, 10-second server timeouts and bounded sockets. |
| Exfiltration or retention | Tools retain no free text. Usage counters are aggregated and addresses are temporary rate-limit keys only. |
| Merchant redirects | HTTPS-only, explicit merchant and destination allowlists, maximum 48-hour offer freshness. |
| Commercial influence | Technical calculation runs before offers. Offers use a separate snapshot and tool. |
No authentication is intentional for this public resource with no user data and no write action. Any future private or personalized feature must establish a new boundary, use resource-appropriate authorization and reject third-party token passthrough.
References: transport specification and MCP security best practices.
Reusable checklist
What a production MCP server should be able to demonstrate
This list audits CompatAir and can also be used to review any remote server. A tool annotation or documentation claim is never sufficient evidence on its own.
- A single Streamable HTTP endpoint and a
server.jsonmanifest usingremotes. - Closed, bounded input schemas validated before processing.
- A conforming
outputSchemaandstructuredContentfor every tool. - A text fallback for older clients.
- Annotations that match the server’s actual authority.
- Origin validation, loopback binding and an HTTPS proxy for remote access.
- Documented rate limits, timeouts, maximum sizes and pagination.
- A clear split between protocol errors and tool execution errors.
- An explicit policy for data, logs, secrets and retention.
- Stable identifiers, method versions and dated snapshots.
- A canonical page and retained evidence in every domain result.
- A changefeed for safe cache and decision invalidation.
- Negative tests for origins, media types, JSON, arguments, quotas and destinations.
- Human-readable and machine-readable documentation released together.
The specification states that clients must treat tool annotations as untrusted unless the server itself is trusted. Clients should also validate structured results and keep a human in the loop for sensitive operations. See the MCP tools specification.
Operational honesty
What the server refuses to assume
- Intake displacement is never presented as free air delivery.
- FAD is compared at the required pressure with no extrapolation outside a documented curve.
- Leaks and pressure drop are added only from explicit measurements.
- Per-action demand requires an action rate. Inflation requires volume, pressures and target time.
- A complete system remains
insufficient_datawhen decisive hose, connector, filtration or lubrication requirements are undocumented. - An absent, expired or non-allowlisted offer is never replaced or invented.
- An MCP result does not replace a manufacturer manual, an in-load measurement, pressure-equipment rules or workplace safety requirements.
Diagnostics
Understand HTTP responses
| Status | Typical cause | Correction |
|---|---|---|
| 400 | Invalid JSON, JSON-RPC, protocol version or tool argument. | Check the request shape and tool schema. |
| 403 | A present Origin is not allowlisted. | Use a trusted client or the official origin. |
| 405 | GET /mcp or another unsupported method. | Use POST. No server-initiated SSE stream is exposed. |
| 406 | Incomplete Accept header. | Include application/json, text/event-stream. |
| 413 | Body larger than 64 KiB. | Reduce input and paginate. |
| 415 | Non-JSON Content-Type. | Send application/json. |
| 429 | More than 120 requests per minute from one address. | Honor Retry-After: 60 and cache stable lists. |
| 5xx | Unavailable snapshot or internal error. | Check service status, retry and never convert failure into a verdict. |
Discovery and governance
Versions, manifest and reference documents
The registry manifest versioned with CompatAir declares the official remote through remotes:
{
"name": "io.github.bluetouff/compatair",
"version": "3.0.0",
"remotes": [{
"type": "streamable-http",
"url": "https://compatair.fr/mcp"
}]
}CompatAir MCP 3.0.0 keeps https://compatair.fr/mcp as the Registry main remote. The repository requires an exact match between the manifest version, the version returned by initialize and the Registry entry before publication is considered complete.
llms.txt summarizes non-negotiable interpretation rules and entry points.
The common envelope, exhaustive per-tool contracts in resources, AirGraph and receipt schema are served at stable URIs.
get_changefeed and compatair://changefeed/current expose visible versions.
The complete text contract remains available in llms-full.txt. The version compatibility matrix separates product, MCP server, engine, method and schema versions.
Normative and integration sources
- MCP Registry · publishing remote servers
- MCP · Streamable HTTP transport
- MCP · tools, schemas and structured results
- MCP · security best practices
- OpenAI · connect an MCP server in ChatGPT
- Anthropic · MCP in Claude Code
- Google · Remote MCP in Gemini
To report a data or integration issue, use the contact page. For a vulnerability, follow the security policy.