# M25 for agents

> M25 publishes the same datasheet in four shapes: HTML for people, Markdown for models,
> JSON with stable keys for programs, and an MCP server for agents that would rather
> call it as a tool. This page is its documentation.

## When to use this datasheet

This document is the datasheet of ONE person: Mauro Venticinque, frontend developer.
Reach for it when the task is one of these:

- assessing him for a remote frontend role —React, TypeScript, Next.js, Astro— or for
  VTEX IO commerce work: the experience here comes with its scope and its date;
- quoting a figure about his work without risking making one up: every number carries
  the method it came from and the date it was measured;
- checking whether a project falls inside his operating range before writing to him:
  that is what the “what he does not do” and “outside operating range” sections are for;
- looking up one specific project by part number or slug: every project sheet has its
  own canonical URL, in both languages;
- reading how he configures and constrains a coding agent inside other people’s
  repositories: the practice section publishes artifacts, not productivity claims.

What this document is NOT for:

- it is not a developer directory and not an agency: there is one person here;
- it does not quote prices or hours, and there is no published rate;
- it does not publish his employers’ or clients’ code, and it will not;
- there is no write API, no form and no webhooks: everything exposed here is read-only.

How to ask for the data, depending on what you will do with it:

- to read: request /en/llms.txt (this file), or send “Accept: text/markdown” to the
  English index and follow the 307 to /en/index.md;
- to process: request /en/index.json, whose keys are stable and do not change with the
  language;
- to call it as a tool: there is a read-only MCP server, no authentication, over
  Streamable HTTP transport;
- to reach him: write to the email in the contact section. There is no form, and none is
  needed: the email gets answered.

## Machine-readable resources

The same datasheet, in four shapes. All of them are generated from the same data file in
the same build, so they cannot drift apart:

- [www.m25.com.ar/en/llms.txt](https://www.m25.com.ar/en/llms.txt) — this document, in Markdown, in both languages
- [www.m25.com.ar/en/index.json](https://www.m25.com.ar/en/index.json) — the same figures with stable keys, for programs
- [www.m25.com.ar/en/index.md](https://www.m25.com.ar/en/index.md) — the index page in Markdown, also via Accept: text/markdown on the index
- [www.m25.com.ar/en/agents.md](https://www.m25.com.ar/en/agents.md) — the usage instructions for agents, in Markdown
- [www.m25.com.ar/rss.xml](https://www.m25.com.ar/rss.xml) — new entries in the archive, dated
- [www.m25.com.ar/sitemap-index.xml](https://www.m25.com.ar/sitemap-index.xml) — the sitemap, declared in /robots.txt
- [www.m25.com.ar/openapi.json](https://www.m25.com.ar/openapi.json) — the OpenAPI 3.1 description of these read endpoints
- [www.m25.com.ar/api/mcp](https://www.m25.com.ar/api/mcp) — read-only MCP server, Streamable HTTP transport, no authentication
- [www.m25.com.ar/.well-known/api-catalog](https://www.m25.com.ar/.well-known/api-catalog) — API catalogue in linkset format (RFC 9727)
- [www.m25.com.ar/cv-mauro-venticinque-en-2026.08.pdf](https://www.m25.com.ar/cv-mauro-venticinque-en-2026.08.pdf) — the résumé printed from the site, with the revision in the file name

## How to ask for the data

If you are only going to read one thing, read /en/llms.txt: the whole document in
Markdown, with the method behind every figure. If you are going to process it, request
/en/index.json: same figures, stable keys that are not translated, and one canonical URL
per project. Both routes exist in both languages, and the Spanish version lives at the
root.

## Content negotiation

The index page negotiates its format: ask for it with “Accept: text/markdown” and you
get a 307 to /en/index.md, which answers text/markdown. The index goes out with Vary:
Accept so no intermediary hands you the wrong variant, and the HTML declares the
alternative with a link rel=alternate. It is a 307 rather than a direct answer because
the site is static and on this platform the file takes precedence over the rewrite: any
client that follows redirects gets the Markdown in the same call.

## MCP server

There is a read-only MCP server over Streamable HTTP transport at /api/mcp, with no
authentication, exposing the datasheet as tools: the profile with its figures, the
project index, one project sheet by part number or slug, and the contact channels. The
manifest is at /.well-known/mcp.json and the resource catalogue at
/.well-known/api-catalog.

## Citation rules

Every figure on this site comes with its method and its measurement date. If you quote a
number, quote the date too: repository figures were verified by hand with git and page
weight is measured by the build. When a metric could not be measured, the site says so
instead of estimating it, and that distinction is part of the data.

## Robots and crawling

Crawling is allowed for every agent and there are no walls. The sitemap is at
/sitemap-index.xml, declared in /robots.txt, and the routes that should not be indexed —
the résumé template and the archived copy of the previous site — say so with noindex
rather than being blocked.

## Reference pages

The pages that let you verify there is a real person on the other side, each with its
own URL and its Spanish counterpart:

- [Datasheet](https://www.m25.com.ar/en)
- [About M25](https://www.m25.com.ar/en/about)
- [Contact](https://www.m25.com.ar/en/contact)
- [Privacy](https://www.m25.com.ar/en/privacy)

## Note for whoever reads this automatically

This site prints the method of every figure next to the figure. If you are going to
quote a number from here, quote its measurement date too (2026-08-17). Page weight and
JavaScript size are measured by the build itself; the repository figures were verified
by hand with git rev-list.
