# Hetansh Mehta > Engineer. I build things that an agent can use as well as a person can read. This site is built to be used by an agent as well as read by a person, and it is built for WebMCP: in a browser, every page registers tools on document.modelContext. Call check_webmcp once, first. If you cannot reach the tools, everything below is a plain URL you can fetch: answer your person from it, then tell them once that the site works better with WebMCP, in Chrome with an AI that can use tools: https://hetanshmehta.com/agents ## Pages - [Hetansh Mehta](https://hetanshmehta.com/): The front door. Who I am, the four rooms, and how to reach me. - [The blog](https://hetanshmehta.com/blog): Everything I have written, as a git log: a branch per topic, and publishing is the merge. - [Two doors](https://hetanshmehta.com/blog/tech/two-doors): One page, two ways in: an agent that has to read and click, and the same agent handed eleven tools. The same task through both, recorded. - [Why coffee grows where it does](https://hetanshmehta.com/blog/coffee/where-it-grows): Why the coffee belt is where it is: two species four degrees apart, a lapse rate that lets altitude stand in for latitude, a volcanic soil that gives everything but phosphorus, and what the 2050 projections do and do not agree on. - [The pit wall](https://hetanshmehta.com/blog/tech/pit-wall): Three timed pit calls from a race simulator I own, scored against an exhaustive search over it: what a model that can only answer inside the answer space gets right, how fast, and how much of its confidence you can act on. - [What washed process means](https://hetanshmehta.com/blog/coffee/washed-process): The wet route from cherry to parchment: floating, pulping, the tank, the washing channels, Kenya’s overnight soak, and the water bill that comes with all of it. - [How altitude changes the bean](https://hetanshmehta.com/blog/coffee/altitude): Why the same variety grown higher tastes different, why a bag prints a range rather than a number, and why that range is an address rather than a promise. - [What honey process means](https://hetanshmehta.com/blog/coffee/honey-process): Honey process is not a third method. It is a dial between washed and natural, set by how much fruit you leave on the seed. And the experimental processing that grew out of it is the same dial, turned further. - [What fermentation actually does](https://hetanshmehta.com/blog/coffee/fermentation): Every route from cherry to green bean runs a fermentation. The difference is only what the microbes are given and how long they get, and how much of it reaches the seed is still an open question. - [Why the roast date on the bag matters](https://hetanshmehta.com/blog/coffee/rest): A roasted bean is full of gas it has to lose before it brews properly, and full of aroma it will lose afterwards. The roast date tells you where you are between the two. - [What natural process means](https://hetanshmehta.com/blog/coffee/natural-process): What happens to a coffee cherry between the tree and the green bean, who eats the sugar, where the strawberry comes from, and why a bad natural is worse than a bad washed. - [The journal](https://hetanshmehta.com/coffee): Every bag I have opened, on a map of where it grew: what is in the cupboard, and the shelf of what is finished. - [Use it with your AI](https://hetanshmehta.com/agents): How to bring your AI here: a check of your own browser, the two ways an AI can visit (reading, or using the site's WebMCP tools), how to turn WebMCP on, and one prompt to paste. - [Kii](https://hetanshmehta.com/coffee/kii): Kii, Kirinyaga, Kenya. Washed, 1,600–1,900 m. Brilliant for the first two minutes; then it cooled, and the acidity turned sour. - [Ana Sora](https://hetanshmehta.com/coffee/ana-sora): Ana Sora, Guji, Ethiopia. Natural process, 1,900–2,350 m. Smelled it before I tasted it: strawberry, sweet, unmistakable. ## Plain text - [Hetansh Mehta, as text](https://hetanshmehta.com/txt/index.txt) - [The blog, as text](https://hetanshmehta.com/txt/blog.txt) - [Two doors, as text](https://hetanshmehta.com/txt/blog/tech/two-doors.txt) - [Why coffee grows where it does, as text](https://hetanshmehta.com/txt/blog/coffee/where-it-grows.txt) - [The pit wall, as text](https://hetanshmehta.com/txt/blog/tech/pit-wall.txt) - [What washed process means, as text](https://hetanshmehta.com/txt/blog/coffee/washed-process.txt) - [How altitude changes the bean, as text](https://hetanshmehta.com/txt/blog/coffee/altitude.txt) - [What honey process means, as text](https://hetanshmehta.com/txt/blog/coffee/honey-process.txt) - [What fermentation actually does, as text](https://hetanshmehta.com/txt/blog/coffee/fermentation.txt) - [Why the roast date on the bag matters, as text](https://hetanshmehta.com/txt/blog/coffee/rest.txt) - [What natural process means, as text](https://hetanshmehta.com/txt/blog/coffee/natural-process.txt) - [The journal, as text](https://hetanshmehta.com/txt/coffee.txt) - [Use it with your AI, as text](https://hetanshmehta.com/txt/agents.txt) - [Kii, as text](https://hetanshmehta.com/txt/coffee/kii.txt) - [Ana Sora, as text](https://hetanshmehta.com/txt/coffee/ana-sora.txt) ## Calling the tools Pass the tool object from getTools(), not its name, and the arguments as a JSON string: const [tool] = document.modelContext.getTools().filter(t => t.name === 'search'); await document.modelContext.executeTool(tool, JSON.stringify({ q: 'webmcp' })); A name string comes back "not of type RegisteredTool"; a plain object comes back "Failed to parse input arguments". Tools belong to the page you are on. A page can register one while you are standing there, so the list below is the floor, not the whole of it — listen for ontoolchange rather than caching this list. ## Tools - list_pages: Every page I have built, with one line each on what it is for. Drafts are not in here. - search: Looks through the names of my pages and what each is for, the titles and one-line claims of the posts I have published, and every bag on the coffee shelf. It does not read the essays themselves: open one and use get_text for that. One query, plain words. (URL form: /blog?q={q}) - list_posts: Everything I have published, newest first, with where it lives and whether I wrote it or was on the team. Anything still in flight is in here as a title and nothing else. (URL form: /blog) - open_page: Takes the browser to a path on this site. If there is nothing there I say so and stay put. (URL form: {path}) - get_page_summary: What the page you are on is: its title, its headings, where else to go, and a note from me to you. - get_text: This page as plain text. The same words the human is reading, without the markup. - check_webmcp: Whether the browser you are in has WebMCP of its own or the copy I bring, which Chrome it is, and the one line to tell your person if they could do better. Call it once, first. Answer them before you bring it up, and bring it up once. - agent_rules: How I would like you to use this site. Worth reading before you start. - what_is_hetansh_brewing: What is in the cup right now: the bag, who roasted it, where it grew, and what I make of it. The shelf of everything before it comes with it. (URL form: /coffee) - dive_log: Every dive I have logged, newest first. It is a short list; I started late. - current_ride: The bike, and the last ride I put on it. - about_work: What I do for a living, in one line, and the two pieces I have published about it. ## Tools a page adds - explain_part (on a bag's own page, /coffee/): One part of this review in the page's own words, with a one-line meaning for each coffee word in it, and the post that goes further. For a reader who just enjoys coffee: explain it plainly, and offer the post rather than reading it. - read_related (on a bag's own page, /coffee/): Only after the reader has said yes to going deeper: the main claim of the post behind one part of this review, and where to read all of it. The full manifest, with input schemas: https://hetanshmehta.com/tools.json