Skip to content

How to best support hundreds or thousands of abilities #21

@JasonTheAdams

Description

@JasonTheAdams

The challenge of tons of tools

AI is funny in that it works like magic sometimes and other times will completely fall apart counterintuitively. One example of this is tools — whether direct calls functions on a model level or tools from an MCP level — wherein the model's ability to select the right tool for the job is finicky. Ironically, the more tools the AI has to work with the less likely it is to know which tool to use. Less is more in this case.

We're introducing the Abilities API in 6.9, which will be the foundation for how folks surface functionality to AI, which will be utilities by the MCP Adapter, at least. It's defensively best to assume that people will register a lot of abilities. I could imagine sites with dozens of plugins totaling hundreds (or thousands) of abilities. If these abilities are simply surfaced 1-to-1 as tools within the MCP server, it will not go over well.

Tentative solution: Layered Tool Pattern

One example of an approach to this is the Square MCP Server, which has three tools:

  • get_service_info — which is used for discovering the services available
  • get_type_info — which provides parameter requirements for a given service's method
  • make_api_request — which executes a service's method

This is described as a Layered Tool Pattern. Basically, the surface area of the API for the AI starts very small and expands via discovery. This makes the underlying tools more like a choose-your-own-adventure than a massive diner menu.

Ability Layers

Given the sheer number of abilities, we likely first need a taxonomy for breaking them down further, likely a category. The category would have a name and description. This list would be provided as part of the system prompt, and would hopefully be at most dozens of terms.

The AI would then be given three tools:

  • get_abilities_by_category — which receives a category, and returns a name/description list of abilities
  • get_ability_info — which receives a category and ability, and returns the parameters for the ability
  • use_ability — which takes a category, ability, parameters objects, and returns the output of the ability

Metadata

Metadata

Assignees

No one assigned

    Labels

    [Type] QuestionQuestions about the design or development

    Type

    No type

    Projects

    Status

    In discussion / Needs decision

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions