Docs menu

Contributing to Thinky

This page is for people building a node kind on OpenX. Thinky, the workspace's assistant, knows a kind only through what the kind tells it: a short guide, a few named tools, and what its open panel is showing. Any pack contributes the same way, ours or yours, and every contribution passes the same review before Thinky or the OpenX MCP Server sees it.

What a kind can tell Thinky

A kind's capability manager tells Thinky about the kind through one optional hook, getAziContribution (the code still carries the assistant's old name). A kind without the hook adds nothing, and nothing about it changes. The hook returns:

FieldWhat it is
KindThe manager's own Type. Every tool the kind contributes starts with it.
GuideWhat the kind is, in 3 to 6 sentences. Thinky reads it only while a panel of the kind is open.
ToolsThe kind's tools, described below.
SharesThe names of the identifiers an open panel of the kind may tell Thinky.
ContextWhat an open panel is showing, as those identifiers.
StatusWhether a node of the kind can run its tools now: ready, needs-sign-in or unavailable.
IntentsRare. Asks the kind adds to the step that decides what kind of turn a message is.

The guide says what the kind is, never how Thinky should work. How Thinky works is the posture prompt every turn starts from, the same prompt the OpenX MCP Server serves to any AI. The kind's long reference stays in its own profile, which Thinky fetches by tool when it needs it.

The platform stamps the contribution with a Version: a hash of every text it declares. A changed guide, description or share is a new version.

Each tool declares:

FieldWhat it is
NameIts name, by the rule below.
TitleWhat a person reads in "Used:" and in confirmations.
ModelDescriptionWhat the model reads: what the tool does, when to use it, when not to, and what it returns.
InputSchemaIts input. Property names say what they hold (warmQueryLookup, never id).
OutputSchemaOptional. Its output: concise by default, paged, with stable ids.
Effectread or propose. Checked against the platform's review list, below.
LoadWhen a turn loads it: open-panel, selected or search.

Naming a tool

Every tool is named <kind>_<verb>_<noun>: lower case, the kind first, then a verb and a noun, for example warmquery_read_query. A name is unique across every kind, and at most 64 characters long, the longest name a model's tool list takes.

Write ModelDescription in at least three sentences: what the tool does, when to use it, when not to, and what it returns. A description names only its own kind's tools. Naming another kind is fine; naming another kind's tool is refused, so one kind never steers the model away from another's.

The two effects

EffectWhat it does
readReads, and changes nothing.
proposeHands the person a change (a proposal, or a draft they keep and save) that they accept.

There is no third effect: no contributed tool changes a workspace by itself. A person accepts every change.

The effect is never taken from the tool's own declaration. The platform keeps a review list that gives each tool its effect by name. A tool that is not on the list is refused until the platform reviews it, and a tool that declares a different effect from the list is refused.

The review list today:

ToolEffect
warmquery_read_queryread
warmquery_draft_querypropose
warmquery_summarize_resultsread
interface_read_pageread
interface_draft_querypropose
database_read_containersread
database_propose_containerpropose

What an open panel shares

At the start of each turn Thinky is told which panels are open: each one's title and kind, which one has focus, which are behind a tab or pinned, and which nodes are selected on the canvas. A panel closed before the message is not mentioned. What each panel is showing follows these rules:

  • A panel tells Thinky nothing unless its kind declares what it shares, in Shares.
  • Set-up panels share nothing: API Keys, Billing, Team Members and Access Management tell Thinky only that they are open.
  • A secret field is never sent. The review refuses a contribution whose Shares names one of its kind's secret fields.
  • A panel shares identifiers only, never a record: at most 8 identifiers, each one line of at most 120 characters, and each one named in Shares. A panel whose context breaks a rule tells Thinky nothing for that turn, and the reason is recorded.

Thinky fetches the details behind an identifier by tool, when the ask needs them. When a kind's tool cannot run (the node needs a sign-in, or is unavailable), Thinky says why instead of acting as if the tool were missing.

What the review refuses

The registration review reads every kind's contribution and refuses it, naming the kind, the tool and the reason, when:

  • it contributes under a kind other than its manager's Type;
  • a tool name breaks the naming rule, or is longer than 64 characters;
  • a tool name is already contributed by another kind (both are named);
  • a guide or a description names another kind's tools;
  • a description does not say what the tool does, when to use it, when not to, and what it returns;
  • a tool is not on the review list, or declares a different effect from it;
  • the guide is shorter than 3 or longer than 6 sentences, or gives working rules ("always...", "you should...") instead of saying what the kind is;
  • Shares names one of the kind's secret fields.

A refused contribution is left out whole, with every reason. One kind's refusal, even a hook that throws, never stops the other kinds from contributing.

How many tools a turn loads

Models choose worse as their tool list grows, so a turn loads only a few tools:

  • A core on every turn: the platform's own tools Thinky has always had (eight today), plus search_tools. The core is trimmed only once the evals show a smaller one does as well.
  • The tools of each kind with an open, ready panel: at most 5 per kind. A kind loads all of its tools or none of them. The focused panel's kind comes first, then the kinds in view, then those behind a tab.
  • A turn binds never more than 20 tools before a search.
  • Every other tool is found with search_tools, by its name or by the words of its description. What a search finds stays loaded for the rest of the turn.

While the same panels stay open, the list stays the same from turn to turn.

Where a contributed tool runs

The OpenX MCP Server is the one place a contributed tool runs. It lists each reviewed tool under the same name, title, description and schemas the kind declares, with its effect as the tool's annotations: a read tool is read-only, and a propose tool is not read-only and never destructive. Each listing also names the tool's kind, effect and load in its _meta (openx/azi-kind, openx/azi-effect, openx/azi-load), which is how Thinky knows which open panel a tool belongs to.

Thinky calls a contributed tool through the server, so any AI connected to the server reaches the same tool with the same rights. The server checks the caller's access rights on every call. A tool is listed only once the platform runs it, so the server never lists a tool it would refuse. The server's tools, the contributed ones by their kind, are listed in Tools.

Evals before a contribution ships

A contribution ships with asks that must pick its tools and asks that must not. One shared set runs every kind's asks with several panels open, so one kind's tools never confuse another's. Thinky must match or beat each assistant it replaces on that assistant's own cases, set by set, and on time to first word and cost per turn. A changed contribution (a new Version) is evaluated again; a version that has already passed is not.

On this page