Tool surface
The tools the site’s MCP server publishes, and the arguments each one accepts.
The tools the site’s MCP server publishes, and the arguments each one accepts.
---
title: "Tool surface"
description: "The tools the site’s MCP server publishes, and the arguments each one accepts."
url: "https://lateano.com/demos/tool-surface"
author: "Colin Lateano"
relatedPosts:
- title: "The tool surface behind this site"
url: "https://lateano.com/writing/the-tool-surface-behind-this-site"
tags:
- title: "How I work"
url: "https://lateano.com/tags/how-i-work"
---
# Tool surface
The tools the site’s MCP server publishes, and the arguments each one accepts.
These are the tools the site’s MCP server publishes. Their descriptions, annotations and arguments come from the same catalogue an agent discovers through tools/list.
list_collectionsList the collections the site publishes — their names, their addresses and how many documents each holds. Three collections hold every document a search can reach, so one call learns what search_content ranges over and a bound is rarely worth naming. The site also publishes pages that belong to no collection, such as its documentation, its about page and its indexes: no search returns them, and list_pages is what enumerates them. Hand a name back to search_content as its collection argument to narrow a search to one. This answers no document text and no tags: search_content finds documents by words, and list_tags gives the vocabulary that cuts across these collections.
limitintegeroptionallist_pagesList the pages no collection holds — the site's documentation, its about page and its index pages — each with its address, its title and what it is about. These are the pages search_content cannot return: a search ranges over collections, and nothing files these into one, so a question about how this site works is answered here rather than there. Hand an address back to get_page_info for that page's metadata and its links. This answers no document text: hand an address to get_page_markdown to read what is written at it, and search_content finds documents by words.
limitintegeroptionalsearch_contentSearch posts, glossary terms and demos at once, best match first. Give it words to match, a collection, or a tag: a call that gives none of the three describes no question and is refused. Three shapes cover most questions — {"match":{"text":"caching","in":"all"}} looks for a word in every field; {"tag":"<a slug list_tags reported>"} returns what carries one tag, and list_tags is where a real slug comes from; {"collection":"glossary","match":{"text":"cache","in":"title"}} narrows to one collection and one field. For one known slug, get_post answers directly; for the metadata of one known route, get_page_info does, and get_page_markdown reads what is written at one. Every answer reports matched beside its rows — how many documents the search found, whether or not they all fit. Where matched is larger than the rows returned, narrow the question with a collection, a tag, or a different field: twenty-five is the most any one search returns, and there is no page after it.
match{ text: string, in: title | body | description | aliases | tags | all }optionalcollectionwriting | glossary | demosoptionaltagstringoptionallimitintegeroptionalget_postLook up one post by its slug and get its metadata. The text is not in this answer: hand the row’s path to get_page_markdown to read it. Every row also names the address the markdown is published at, for a caller that fetches its own.
slugstringrequiredlist_tagsList the tags in use across the site — each slug, the title a reader reads, how many documents carry it across the whole site, and that same count broken down by collection. The whole-site number is returned, so there is no need to add the collections up. Tags cut across collections, so this is what to read when the question is about a subject rather than a kind of page. Hand a slug back to search_content as its tag argument. This answers no document text: search_content finds documents by words, and get_page_markdown reads what is written at one address.
limitintegeroptionalget_page_infoGet the metadata and graph edges for one route — what cites it, what it cites, and what shares its tags. For searching by words rather than address, search_content is the tool.
routestringrequiredget_page_markdownRead the markdown of one page, by its address. This is how you read a page you found: search_content and list_pages answer addresses, and this answers what is written at one. An index page — a tag page, a collection archive, the site root — is a list of links rather than prose, because that is what the page itself is. A long page is cut, and the answer says where it was cut and names the address that publishes the whole of it. This answers no metadata: get_page_info reads a page’s title, its collection and its links.
routestringrequiredsubmit_feedbackRecord a message for the author of this site. Useful when a person asks to send feedback, when something on the site reads wrong, or when a task here found that something is not here at all — a page, a definition, a Tool, or an argument. One idempotency key names one submission: send a new key to say something new, and reuse that same key only to retry a call that may not have arrived. The submission is stored for the author to read later; no reply comes back through this tool.
idempotency_keystring (uuid)requiredmessagestringrequiredkindmissing | broken | confusing | inaccurate | otherrequiredseverityhigh | medium | lowrequiredaboutstringoptional