Skip to main content
Patrick Colm Audley

Patrick Colm Audley

Hacker · Full-Spectrum Technologist · Polymath

Colophon

How to use this site — for AI, robots & fellow nerds

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://patrickaudley.com/
curl -H "Accept: text/turtle"           https://patrickaudley.com/
curl -H "Accept: application/n-triples" https://patrickaudley.com/
curl -H "Accept: text/markdown"         https://patrickaudley.com/

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

curl https://patrickaudley.com/index.jsonld
curl https://patrickaudley.com/index.ttl
curl https://patrickaudley.com/index.md
curl https://patrickaudley.com/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 32 SKOS concepts, 3 publications and 2 patents, most grounded with Wikidata QIDs. Primary entities are linked from the root JSON-LD document. The root 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://patrickaudley.com/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://patrickaudley.com/.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 person identity, URLs, profiles, and identifiers.
get_cvReturn CV and resume resources in JSON, Markdown, plain text, HTML, and PDF forms.
get_publicationsReturn publication metadata and canonical publication pages.
get_projectsReturn selected project and open-source work from canonical site data.
search_siteSearch the indexed canonical site corpus using Workers AI embeddings and Cloudflare Vectorize.
answer_questionAnswer questions about Patrick Audley from retrieved canonical context with citations.
cite_claimResolve a claim about Patrick Audley 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://patrickaudley.com/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://patrickaudley.com/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":"patrickaudley.com site agent","version":"0.2.0"}}}

# Every request AFTER initialize MUST echo BOTH the session id and the
# negotiated protocol version:
curl -s https://patrickaudley.com/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

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://patrickaudley.com/.well-known/mcp.json          | jq '.tools[].name'
curl -s https://patrickaudley.com/.well-known/agent-policy.json | jq '.agent_use, .citation_required'
curl -s https://patrickaudley.com/.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://patrickaudley.com/.well-known/pgp.txt | gpg --import
curl -sO https://patrickaudley.com/llms.txt
curl -sO https://patrickaudley.com/llms.txt.asc
gpg --verify llms.txt.asc llms.txt

curl -s https://patrickaudley.com/.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 Source Serif 4. 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: d275881