A tool is ONE function an agent calls — one MCP tool, one CLI command, one API endpoint. A product with three functions is three files, each named after its function.
Note. Its capability must be listed in tags.yml. If none fits, add it there in the same pull request.
How to create
1. Pick the capability it performs
capability: puts your function on a shelf next to every other vendor’s version of the same job, so it must be listed under capability: in tags.yml, the one file that holds every tag. Look there first. If nothing fits what your function does, add an entry — a label and a few synonyms — in the same pull request.
2. Create one file per function
A tool is ONE thing an agent calls — one MCP tool, one CLI command, or one API endpoint — and its file is named after that function. Apollo enriching a person, searching for people and enriching a company is three files, not one product page. The path is the key, and the key is the URL.
companies/apollo/tools/enrich-person.md companies/apollo/tools/search-people.md companies/apollo/tools/enrich-company.md3. Write the header
A YAML header between --- lines, then an optional markdown body that describes the function. Unknown fields are rejected, so a typo fails the check with the file path instead of silently vanishing. The summary is one sentence saying what the function does, in words someone can act on.
companies/apollo/tools/enrich-person.md --- name: Enrich a person summary: Returns one person's title, employer, employment history and work email, matched from an email, a LinkedIn URL, or a name plus company. capability: enrich-contacts docs: https://docs.apollo.io/reference/people-enrichment mcp: apollo_people_match cli: apollo people enrich api: POST /people/match aliases: - apollo/enrich-contacts updated: 2026-09-26 --- The more identifiers you pass, the likelier a match; check `match_confidence` in the response. Personal emails and phone numbers are off by default: set `reveal_personal_emails` or `reveal_phone_number` (phone numbers arrive later at a `webhook_url`). A match costs 1 credit for demographics or an email and 8 more for a mobile phone; a request that finds nothing costs nothing.4. Name the call on each way in
mcp:, cli: and api: name the exact call on each way in your company.md declares: the MCP tool name, the CLI command (starting with the binary), or METHOD /path for an API — exactly as the vendor’s docs print it, with docs: pointing at the page that names it. A published tool needs at least one call and a docs: page; until it has both, set status: draft — a draft has no page and no file.
companies/stripe/company.md --- name: Stripe domain: stripe.com category: payments tagline: Payments, billing and subscriptions for internet businesses. docs: https://docs.stripe.com github: https://github.com/stripe logo: stripe.jpg mcp: url: https://mcp.stripe.com auth: oauth docs: https://docs.stripe.com/mcp cli: install: npm install -g @stripe/cli binary: stripe auth: oauth docs: https://docs.stripe.com/stripe-cli api: url: https://api.stripe.com auth: api_key env: STRIPE_API_KEY keyUrl: https://dashboard.stripe.com/apikeys docs: https://docs.stripe.com/api updated: 2026-09-27 ---5. Date it
updated is the day you last checked these facts, as YYYY-MM-DD. It is required, and it travels: a workflow file’s date is the newest of the tools it uses, so this date moves every workflow page built on your tool.
updated: 2026-09-166. Check it locally
One command parses every file, resolves every reference and renders the result. It reports every problem at once, each with the file that caused it (and the line, for a problem in the body). The same checks run again in CI on your pull request.
pnpm install pnpm content:check pnpm dev # then open /tools/apollo/enrich-person7. Open a pull request
One company, tool or workflow per pull request keeps the review quick. Say what you added and how you checked the facts. Maintainers review for accuracy, not for style — the build owns style.