Skip to main content

/developers

Tim Benniks developer resources.

Machine-readable surfaces for AI agents and integrators. Start with llms.txt, read the agent contract, call the MCP server, or fetch markdown twins. No HTML scraping required.

First call

Run one request

No key, no account, no signup. Every public endpoint below is unauthenticated and read-only. Copy a line, run it, and you have a working call. Errors come back as application/problem+json (RFC 9457); every response carries RateLimit and RateLimit-Policy headers.

Search the content · REST

curl -s 'https://timbenniks.dev/api/v1/search?query=composable&limit=2'

# 200 application/json
# { "results": [ { "type": "writing",
#                  "title": "Ten AI security problems hiding in plain text",
#                  "date": "2026-08-05", "description": "…", "tags": [ … ],
#                  "url": "https://timbenniks.dev/writing/<slug>",
#                  "md": "https://timbenniks.dev/writing/<slug>.md",
#                  "source": "…" } ],
#   "engine": "index" }

List the tools · MCP handshake

# 1. Initialize; use the returned protocolVersion below.
curl -s https://timbenniks.dev/api/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":"1.0"}}}'

# 2. Confirm initialization (202, empty body).
curl -s https://timbenniks.dev/api/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2025-11-25' \
  -d '{"jsonrpc":"2.0","method":"notifications/initialized"}'

# 3. List the six read-only tools (200, JSON result).
curl -s https://timbenniks.dev/api/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2025-11-25' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'

# No session ID is required. GET with Accept: text/event-stream
# returns 405: this server sends immediate JSON responses.

Read a page as markdown

curl -s https://timbenniks.dev/about.md
curl -s -H 'Accept: text/markdown' https://timbenniks.dev/about

# 200 text/markdown; charset=utf-8
# Vary: Accept, Accept-Encoding
# Same twin for /writing/<slug>.md, /videos/<slug>.md, /projects/<slug>.md.

What failure looks like

curl -si 'https://timbenniks.dev/api/v1/search'   # query is required

# 400 application/problem+json; charset=utf-8
# api-version: 1
# ratelimit: "public";r=118;t=60
# ratelimit-policy: "public";q=120;w=60
# { "type": "https://timbenniks.dev/developers#missing-query",
#   "title": "Search query required", "status": 400,
#   "detail": "The query parameter is required and must not be empty.",
#   "instance": "/api/v1/search", "code": "MISSING_QUERY",
#   "resolution": "Retry with a URL such as /api/v1/search?query=developer%20experience." }
#
# 429 once you pass 120 requests / 60s, read RateLimit and Retry-After to back off.

Tim Benniks MCP server

Model Context Protocol

Read-only tools exposed via streamable HTTP. No authentication on public endpoints.

/.well-known/webmcp.json
Same catalog at well-known URI

Agent-readable resources

Indexes and content negotiation

Public tool summary

  1. 01

    get_page_context

    Call first. Returns page type, markdown twin URL, and which tool to use next.

  2. 02

    search_site

    Full-text search across writing and videos via content-index.json.

  3. 03

    get_content

    Fetch one page or article as markdown. Includes video transcripts when available.

  4. 04

    get_press_kit / request_booking

    Bios, photos, topics, and a draft booking message for human confirmation.