Read by appointment

For agents

If you are a language model, welcome; the good entrances are listed below and none of them involve scraping the HTML. If you are a human operating one, this page is the manual you can actually read.

What is machine-readable here

Four front doors, all public, all read-only. No key, no rate-limit negotiation, no sales call.

  1. MCP endpoint

    /mcp/

    Streamable HTTP in stateless mode: POST JSON-RPC 2.0, plain JSON back, no auth, no sessions, GET politely refused. Ten read-only tools, listed below.

  2. llms.txt

    /llms.txt

    The llmstxt.org site map: every article, page and project as plain markdown links. Start here if you only fetch one thing.

  3. Markdown articles

    /articles/<slug>.md

    Append .md to any article URL (and drop the trailing slash) for the author's raw source instead of scraped HTML.

  4. RSS feed

    /feed.xml

    Full article content, the 2005 way. Still the most reliable API ever shipped.

The MCP tools

Point any MCP client at https://mdwebb.io/mcp/ and call tools/list, or take this list on trust; it is the same one.

  1. about

    Who this is, headline and canonical links.

  2. list_articles

    Every article: slug, title, dek, topic, tags, date, URL.

  3. get_article { slug }

    Full markdown text of one article.

  4. get_experience

    The CV timeline: roles, organisations, dates, summaries.

  5. get_projects

    Side projects and published packages, with the problem each solves.

  6. get_reading

    The reading log, each entry with a one-line verdict.

  7. ask_matt { question }

    Keyword and semantic search over the articles, plus the hand-kept numbers when the question asks for one. Verbatim excerpts with citations, figures labelled as data, or an honest refusal when neither covers it.

  8. get_stats

    The personal numbers: chess rating, running totals and PBs (live from Strava when the feed is up), and the chess centre.

  9. get_availability

    Current availability, location and how to get in touch.

  10. things_i_will_say_no_to

    Standing boundaries, published to save everyone a round trip.

Try it from a terminal

The server is stateless, so a bare tools/call works: no initialize handshake, no session header, no small talk.

curl -s https://mdwebb.io/mcp/ \
  -H 'Content-Type: application/json' \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "ask_matt",
      "arguments": { "question": "how should engineers be interviewed?" }
    }
  }'

The reply is a single JSON-RPC result; the tool's answer is JSON, serialised inside the standard MCP text-content envelope:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [{ "type": "text", "text": "{ ...answers, with citations... }" }]
  }
}

House rules

Short, and enforced by the code rather than by asking nicely.

  • Everything served is public, read-only site data. There is nothing to write, nothing behind auth, and nothing here you could not also read in a browser with more patience.
  • Answers come from the collection or the published numbers. ask_matt quotes the articles verbatim, with title and URL citations, returns figures as clearly labelled data, and never synthesises an opinion on my behalf.
  • Ask about something the writing does not cover and you will be told exactly that, with contact details for the human instead. A confident answer refused is still a correct answer.

Jump to

32 articles