# Models read names

[Journal](/journal/)

October 2, 2026 · [guides](/journal/#guides)



An internal ID in an MCP server key used 43 of a 64-character tool name and left the model five letters of the tool it meant.

![A patch panel of blank cable tags where one overlong tag is cut off into a block of stamped squares, while the verdigris cable of a short tag runs cleanly into a round instrument.](/_astro/models-read-names.aCHyZqcs_15FudK.avif)

A tool name is part of the prompt. Put a database key in it and the model reads a database key, and a length limit can turn that key into a hash.

We learned this from one request. A user asked Muniment Desktop to look up PHP documentation through the Context7 MCP server. The reply worked, and the action list labeled the call like this: `Mcp extend a3d717fb 548e 4a91 b750 dcb24918cf99 resol 50e88efe`.

## A UUID spent the name budget

Our desktop hands MCP servers to Pi, the agent harness it runs. Pi [names each server tool `mcp__<server>__<tool>`](https://github.com/earendil-works/pi/blob/main/packages/coding-agent/docs/mcp.md) and replaces every character other than letters, digits, and underscores.

We had keyed each server by its extension record: `extend-` plus a UUID. That key alone took 43 characters, before Pi added its prefix or a single letter of the tool name.

Providers cap tool names. OpenAI’s API specification allows [a function name of at most 64 characters](https://github.com/openai/openai-openapi/blob/master/openapi.yaml), while Claude’s documentation allows [up to 128](https://platform.claude.com/docs/en/agents-and-tools/tool-use/define-tools). A harness that serves every provider fits the smallest limit.

So the 64-character name kept five letters of `resolve-library-id` and an eight-character hash. A model choosing among tools saw `resol`. Our chat label, built from the same string, showed the user a UUID.

| Part | Keyed by ID | Keyed by name |
| --- | --- | --- |
| Server key | 43 characters | 8 characters |
| Tool name left | `resol` and a hash | `resolve_library_id` |
| Full name | 64 characters | 33 characters |
| Chat label | UUID fragments | MCP Context7 · resolve library id |

## IDs still key the storage

Servers now take the name the user knows. We keep the characters Pi accepts, cap the key at 24, and compare names the way Pi does, where a hyphen and an underscore count as the same character. Two extensions named Context7 get the first eight characters of their IDs as a suffix, so a clash stays readable and unique.

Storage did not move. Bearer tokens and sign-ins still live under the extension ID, which never changes when a user renames a server. Models read the name, and the vault reads the ID.

Claude’s tool guide recommends [meaningful namespacing in tool names](https://platform.claude.com/docs/en/agents-and-tools/tool-use/define-tools) for the same reason. Selection improves when the name says what the tool does. Pi, OpenAI, and Anthropic are neither Muniment customers nor endorsers.

## Every model-visible string is an interface

We had reviewed the MCP schema, the descriptions, and the sign-in flow. Nobody reviewed the server key, because it looked like plumbing.

Plumbing that reaches a prompt stops being plumbing. Server keys, tool names, provider IDs, skill names, and the labels built from them belong in the same review as an API field. Run your longest real ID through the provider’s smallest limit and read what survives. The [desktop docs](/docs/extensions/) show how replies label each tool call now.

## Sources

1.  [Pi documentation: MCP servers](https://github.com/earendil-works/pi/blob/main/packages/coding-agent/docs/mcp.md) github.com
2.  [OpenAI API specification](https://github.com/openai/openai-openapi/blob/master/openapi.yaml) github.com
3.  [Claude documentation: Define tools](https://platform.claude.com/docs/en/agents-and-tools/tool-use/define-tools) platform.claude.com
