Skip to main content

Blackcat Informatics® Inc.

Bringing elegance to complexity since 1996.

Colophon

How to use this site — for AI, robots & data scientists

This site is built for machines as much as for people. Every page has machine-readable equivalents, reachable by content negotiation or explicit URL, and the whole knowledge graph is queryable. The recipes below are copy-paste ready.

Content negotiation

The site homepages negotiate on the Accept header — same URL, the representation you ask for:

curl -H "Accept: application/ld+json"   https://blackcatinformatics.ca/
curl -H "Accept: text/turtle"           https://blackcatinformatics.ca/
curl -H "Accept: application/n-triples" https://blackcatinformatics.ca/
curl -H "Accept: text/markdown"         https://blackcatinformatics.ca/

Every page — not just the homepage — is also addressable by explicit URL:

curl https://blackcatinformatics.ca/index.jsonld
curl https://blackcatinformatics.ca/index.ttl
curl https://blackcatinformatics.ca/index.md
curl https://blackcatinformatics.ca/llms.txt
  • /index.jsonld → JSON-LD · /index.ttl → RDF Turtle · /index.nt → N-Triples
  • /index.md → Markdown · /llms.txt, /llms-full.txt → LLM context (text/plain)

Homepages negotiate transparently at the edge (Vary: Accept); the explicit per-page URLs always work.

The knowledge graph

This dataset currently exposes 31 SKOS concepts, 3 publications and 2 patents, most grounded with Wikidata QIDs. Primary entities are linked from the root JSON-LD document. The company node is #bii and the person node is #paudley.

Vocabularies: Schema.org · FOAF · SKOS · DOAP · BIBO · vCard · PROV-O · OWL · Dublin Core · Wikidata.

SPARQL

The knowledge graph is queryable through a SPARQL endpoint, with dataset metadata in VoID. Example — every concept with its Wikidata grounding:

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX owl:  <http://www.w3.org/2002/07/owl#>
SELECT ?concept ?label ?wikidata WHERE {
  ?concept a skos:Concept ; skos:prefLabel ?label .
  OPTIONAL { ?concept owl:sameAs ?wikidata }
}
curl -G https://blackcatinformatics.ca/sparql \
  --data-urlencode query@query.rq \
  -H "Accept: application/sparql-results+json"

MCP

This site exposes itself over the MCP (Model Context Protocol). Point an MCP client at the descriptor to discover and call read-only tools:

https://blackcatinformatics.ca/.well-known/mcp.json

Runtime model

ModeStatus
Static descriptor discovery/.well-known/mcp.json
Browser-mediated WebMCP/webmcp.js
Public Streamable-HTTP MCP (/mcp)✓ read-only
Read-only tools only
Search/answer via Workers AI + Vectorize

Tools

This table mirrors the tool list in mcp.json exactly (all read-only):

ToolPurpose
get_identityReturn canonical organisation identity, URLs, contacts, and identifiers.
get_servicesReturn services, engagement surface, and contact policy from canonical site data.
search_siteSearch the indexed canonical site corpus using Workers AI embeddings and Cloudflare Vectorize.
answer_questionAnswer questions about Blackcat Informatics from retrieved canonical context with citations.
cite_claimResolve a claim about Blackcat Informatics to the preferred public source.
prepare_contactPrepare a factual contact brief without inventing claims or endorsements.
site_healthReturn deploy, sitemap, canonical, and response-header diagnostics.

Worked example

/mcp is a stateful streamable-HTTP JSON-RPC endpoint: a session opens with an initialize handshake and capability negotiation, then reuses the Mcp-Session-Id the server returns — and echoes the negotiated MCP-Protocol-Version header on every later request. The simplest correct client is the MCP Inspector — the spec's recommended first stop for Streamable HTTP servers; it handles the handshake, negotiation, session, and SSE transport for you:

# Recommended — the Inspector manages initialize, capabilities, the
# Mcp-Session-Id, the MCP-Protocol-Version header, and the SSE transport:
npx @modelcontextprotocol/inspector      # then connect to https://blackcatinformatics.ca/mcp

# Raw JSON-RPC, for reference. The session is stateful, in order:
#   1. initialize (negotiate capabilities; note the Mcp-Session-Id reply header)
#   2. notifications/initialized
#   3. tools/list      4. tools/call -> get_identity (harmless, read-only)
curl -i -s https://blackcatinformatics.ca/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'

# ← server reply (headers + result, elided):
#   HTTP/1.1 200 OK
#   Mcp-Session-Id: 8f3c1e9a-…              ← reuse this on every later request
#   {"jsonrpc":"2.0","id":1,"result":{
#     "protocolVersion":"2025-11-25",
#     "capabilities":{"tools":{"listChanged":true}},
#     "serverInfo":{"name":"blackcatinformatics.ca site agent","version":"0.2.0"}}}

# Every request AFTER initialize MUST echo BOTH the session id and the
# negotiated protocol version:
curl -s https://blackcatinformatics.ca/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "Mcp-Session-Id: 8f3c1e9a-…" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -d '{"jsonrpc":"2.0","method":"notifications/initialized"}'

# then list the tools (same two headers):
#   -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'
# ← {"jsonrpc":"2.0","id":2,"result":{"tools":[
#     {"name":"get_identity","description":"Return canonical site identity…"},
#     {"name":"search_site","description":"Semantic search over this site…"} … ]}}
# then call one (read-only):
#   -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_identity","arguments":{}}}'

Machine-readable endpoints

Licensing & AI use

  • AI/LLM training is explicitly permitted. The crawl policy is open — no Disallow rules (see /robots.txt and the Content-Signal header).
  • Content is licensed Creative Commons BY-NC-SA CAv2.5; attribution to “Blackcat Informatics® Inc.” appreciated.

Provenance & verification

What you fetch here can be independently verified as authentic:

Verification recipes

Inspect the discovery layer (tools, agent policy, skills):

curl -s https://blackcatinformatics.ca/.well-known/mcp.json          | jq '.tools[].name'
curl -s https://blackcatinformatics.ca/.well-known/agent-policy.json | jq '.agent_use, .citation_required'
curl -s https://blackcatinformatics.ca/.well-known/agent-skills/index.json | jq '.skills[].name'

Verify a signed artifact, then inspect build provenance:

# import the published key, then verify any signed source
curl -s https://blackcatinformatics.ca/.well-known/pgp.txt | gpg --import
curl -sO https://blackcatinformatics.ca/llms.txt
curl -sO https://blackcatinformatics.ca/llms.txt.asc
gpg --verify llms.txt.asc llms.txt

curl -s https://blackcatinformatics.ca/.well-known/content-provenance.json | jq '.'

Full identity, keys, signatures, privacy and mail-security details — with live in-browser verification — are on the Trust & Provenance page.

Build & technology

The generator is badged BespokeIdentityHub_v2.5. Under the hood, the site is rendered to static HTML and linked data by a bespoke Go html/template pipeline; assets are content-addressed and integrity-pinned with SRI, and images are optimized at build time with jampack. Typefaces are Inter and Hubot Sans. The site sets no cookies, reads with no JavaScript required, and embeds no third-party trackers; hosted behind Cloudflare and Apache, with machine-readable resources signed using OpenPGP.

Build: 4e109ad