For agents
This portfolio is built to be operated, not just read. In a browser that ships WebMCP (Chrome 149+ behind the origin trial or the#enable-webmcp-testing flag), the pages here register page-local tools an agent can call while the human watches. On every other browser the site works exactly as before — the tools are progressive enhancement, never a requirement.
Every tool declares in the page and executes on the server, where the output budget (1500 characters per answer), the shared per-IP rate brake, and the credentials live. A page bug cannot widen what an agent gets.
The tools
search_work
read-only
Search Michelangelo Zampogna's portfolio of case studies by keyword — client, industry, discipline or topic (e.g. "travel", "BBC", "accessibility"). Returns matching projects with their ids; pass an id to get_case_study for the full story.
queryrequired— Keywords to search for, e.g. "travel booking" or "BBC".fieldoptional— Restrict to one field: client | title | industry | description. Omit to search all.
get_case_study
read-only
Read one case study from the portfolio. Returns the summary and the names of its sections; pass `section` to read one section in full. One section at a time — ask again for another.
project_idrequired— The project id search_work returned, e.g. "bbc-01".sectionoptional— One section to read in full, by the name the summary listed. Omit for the overview.
list_writing
read-only
List Michelangelo's recent public writing and talks — Medium articles and YouTube videos — as titles with links. Excerpts only; the links open off-site.
limitoptional— How many articles to list (1–6). Omit for 3.
navigate_to_case_study
acts on the page or beyond it
Open one case study in the visitor's browser — navigates this page to the project's own page so the human sees it. Find ids with search_work first. Returns where the page went.
project_idrequired— The project id search_work returned, e.g. "bbc-01".
filter_projects
acts on the page or beyond it
Filter the portfolio grid to one company's projects — navigates this page to /portfolio with that filter applied so the human sees it. Returns what was filtered, or which companies exist if nothing matched.
company_keyrequired— The company to filter by — a company_key or client name from search_work, e.g. "directferries" or "BBC".
request_contact
acts on the page or beyond it
Deliver the visitor's message to Michelangelo, AFTER the human has provided their name, email and message themselves, you have read all three back, and they gave an explicit go-ahead. Delivery may be immediate — only call once the human clearly said yes.
namerequired— The visitor's name, as they gave it.emailrequired— The visitor's email address, as they gave it.messagerequired— The message to deliver, confirmed by the visitor.purposeoptional— Optional: why the visitor is reaching out, e.g. "role enquiry".
Budgets and gates
- Answers are capped at 1500 characters, labelled when truncated — ask for one section at a time rather than everything at once.
- All tools share one per-IP rate brake (30 calls a minute by default).
request_contactsends a real message, so it is capped at 3 per hour per IP, requires the human's explicit go-ahead read back in full, and — where the browser ships it — is additionally gated behind the browser's own user-interaction prompt. An unverified visitor may receive the site's own confirmation step instead of immediate delivery.- Navigation tools only move the page to targets the server resolved; an unresolvable request is answered in words and the page stays put.
Other ways in
- /llms.txt — the site's index for language models, generated from the same corpus.
- The MCP server — the full Model Context Protocol surface behind this site, for agents with an MCP client rather than a browser.
- /conversation — ask about any project, role or decision in natural language.
- /portfolio — every case study, one canonical URL each.