# PCB Capability Evidence — API and MCP integration

Documentation and live playground: https://champion-pcb-capabilities.chipmoreno.chatgpt.site/developers

API base: https://champion-pcb-capabilities.chipmoreno.chatgpt.site/api/v1

OpenAPI 3.1: https://champion-pcb-capabilities.chipmoreno.chatgpt.site/openapi.json

Public MCP endpoint: https://champion-pcb-capabilities.chipmoreno.chatgpt.site/api/mcp

## Access

This is a free public, read-only preview. No account or API key is required for the documented API or public MCP endpoint. The initial dataset contains one company, Champion Asia Group, with 91 capability/evidence records and 45 inventoried URLs. This group is not established as a Taiwan manufacturing site by the reviewed sources.

The separate `/mcp` endpoint integrates with the Sites-managed connection flow. External clients should use the public `/api/mcp` endpoint above.

## JSON API

```sh
curl 'https://champion-pcb-capabilities.chipmoreno.chatgpt.site/api/v1/companies'
curl 'https://champion-pcb-capabilities.chipmoreno.chatgpt.site/api/v1/companies/champion-asia/capabilities?field=Layer&limit=3'
curl 'https://champion-pcb-capabilities.chipmoreno.chatgpt.site/api/v1/claims/CA-0001'
```

All endpoints accept GET:

| Path | Data |
| --- | --- |
| `/companies` | Company records; optional `query`, `headquarters_country`, `capability_query` |
| `/companies/{company}` | Company metadata, evidence counts and links |
| `/companies/{company}/capabilities` | That company's claims |
| `/companies/{company}/sources` | Source inventory; optional `status`, `language` |
| `/capabilities` | Claims across companies; optional `company` filter |
| `/claims/{claim}` | Claim and its source record |
| `/fields` | Available field labels and claim counts; optional `company` |
| `/meta` | Dataset counts, API version, snapshot timestamp, evidence note |

Use a slug or UUID for `{company}` and the claim's `record_id` for `{claim}`.

Capability filters: `query`, `field`, `production_tier`, `material`, `factory`, `evidence_status`. Text filters use case-insensitive substrings; evidence-status, source-status and headquarters-country filters use exact case-insensitive matches. Filters operate within a single claim record. Numeric specifications are currently readable strings; the API does not infer numeric comparisons or combine claims from incompatible factories/tier/material contexts.

List endpoints return `data`, `pagination`, and `meta`. Use `limit` (1–100; default 25) and `offset` (default 0). `pagination.has_more` and `pagination.next_offset` indicate the next page.

```js
const base = "https://champion-pcb-capabilities.chipmoreno.chatgpt.site/api/v1";
let offset = 0;
const claims = [];
for (;;) {
  const r = await fetch(`${base}/companies/champion-asia/capabilities?limit=100&offset=${offset}`);
  if (!r.ok) throw new Error(`HTTP ${r.status}`);
  const result = await r.json();
  claims.push(...result.data);
  if (!result.pagination.has_more) break;
  offset = result.pagination.next_offset;
}
```

Errors use `{ "error": { "code": "…", "message": "…" }, "docs": "…" }`. HTTP 400 means invalid/unknown parameters; 404 means unknown company, claim or endpoint; 405 rejects write methods; 503 means data is unavailable. CORS permits cross-origin browser GET requests.

Python standard-library example:

```python
import json
from urllib.request import Request, urlopen

base = "https://champion-pcb-capabilities.chipmoreno.chatgpt.site/api/v1"
request = Request(base + "/companies/champion-asia",
                  headers={"User-Agent": "pcb-evidence-client/1.0"})
with urlopen(request) as response:
    result = json.load(response)
print(result["data"]["name"])
```

Use a descriptive `User-Agent` for Python integrations. The hosting gateway currently rejects Python's default urllib header with HTTP 403.

Server database snapshots are cached for 30 seconds and HTTP responses may also be cached for 30 seconds. Inspect `meta.snapshot_loaded_at`. The preview caps each underlying table at 10,000 rows; an oversized dataset returns an explicit error rather than a truncated result.

## MCP

Add the public MCP URL to a client that supports remote Streamable HTTP servers. Client configuration syntax varies. The server supports protocol 2026-07-28 and legacy 2025-11-25, 2025-06-18 and 2025-03-26 clients. It returns JSON and does not create session IDs or GET/DELETE streams.

Tools:

- `search_companies`: name/headquarters search and optional capability mentions.
- `get_company`: one company profile with record counts.
- `search_capabilities`: scoped claim search with factory, tier, material and evidence filters.
- `get_claim_evidence`: one claim and its original source record.
- `get_company_sources`: inventoried pages/PDFs and access/review states.
- `list_capability_fields`: discover existing field labels and counts.

Modern requests carry protocol metadata on every request and matching HTTP headers:

```sh
curl 'https://champion-pcb-capabilities.chipmoreno.chatgpt.site/api/mcp' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2026-07-28' \
  -H 'Mcp-Method: tools/call' \
  -H 'Mcp-Name: search_capabilities' \
  --data '{
    "jsonrpc":"2.0","id":1,"method":"tools/call",
    "params":{
      "name":"search_capabilities",
      "arguments":{"company":"champion-asia","query":"impedance","limit":2},
      "_meta":{
        "io.modelcontextprotocol/protocolVersion":"2026-07-28",
        "io.modelcontextprotocol/clientInfo":{"name":"example-client","version":"1.0"},
        "io.modelcontextprotocol/clientCapabilities":{}
      }
    }
  }'
```

To discover modern tools, call `server/discover` or `tools/list` using matching metadata and `Mcp-Method`. `Mcp-Name` is needed for `tools/call`. For legacy clients, use `initialize`, send `notifications/initialized`, then call `tools/list` and `tools/call`. Each client request is an HTTP POST.

Modern tool responses contain `resultType: "complete"`, text content, and structured JSON in `structuredContent`. Input/protocol errors use JSON-RPC errors. A valid tool call that encounters a missing record or unavailable database returns `isError: true` with an explanatory result.

Server/desktop clients can connect without an Origin header. Browser MCP requests must originate from this site; use the JSON API for arbitrary cross-origin browser integrations.

## Interpreting the research

Each claim includes its readable value, source wording, factory/entity, production tier, material/product, conditions, source URL, evidence status, source-check date, and translation method. A checked source or machine-assisted translation is not an independent manufacturing audit. Product cases and future expansion targets retain their scope; certificate copies may be expired. Missing data remains unknown/unpublished.

Do not infer that a factory has capacity available now, will accept an order, or can satisfy a drawing by combining unrelated published numbers. Source dates and record creation/update dates have different meanings. Follow the citations for the original conditions.
