> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tablepro.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Versioning

> What the stability contract covers on each surface, which MCP protocol versions the server accepts, and how a break is announced

Ask the server which protocol versions it takes, never this page: `server/discover` returns them in
`supportedVersions`, and an unsupported one is rejected with `-32022` whose `data.supported` carries
the same list. A client that hardcodes the list breaks on the release that adds one.

The other number, TablePro's own, follows semver and governs every surface in
[the contract](#what-the-contract-covers).

## What the contract covers

| Surface | Under the contract | Can appear within a major version |
| - | - | - |
| `tablepro://` links on the Mac | Every path and parameter on [URL scheme](/developers/url-scheme) | New paths and optional parameters |
| `tablepro://` links on iPhone and iPad | `connect/<uuid>` and `connect/<uuid>/table/<name>` | New paths |
| Database URLs | Every scheme and query parameter on [Connection URLs](/connections/urls) | New schemes and parameters |
| AppleScript | Every term in the dictionary, with its four-character code | New classes, properties, commands, enumerators and optional parameters |
| MCP server | Tools, resources, prompts, error codes, `/mcp`, `/v1/integrations/exchange`, and the default port `23508` | New tools, resources, prompts, codes, optional inputs and output fields |
| Pairing | The `integrations/pair` link and its parameters, the code sent to `redirect`, and the exchange | New optional parameters |
| `tablepro` command | `/usr/local/bin/tablepro` and the arguments it takes | New kinds of argument |
| App identity | Bundle ID `com.TablePro`, and `Contents/MacOS/tablepro-mcp` inside the bundle | Nothing |
| Install location | Not covered | Anything. Find the app by bundle ID |
| Files, preferences and Keychain items the app writes | Not covered | Anything. See [what is not under the contract](/developers/versioning#what-is-not-under-the-contract) |

## Which era gets new work

The newest protocol version is the only one that gets new features. It is stateless, it carries two
methods no older version can reach, and it is what a new client should be built against.

Older versions keep working through `initialize` and `Mcp-Session-Id` so a shipped client does not
break on an app update, and they see a reduced feature set. One stays accepted for as long as the
[specification](https://modelcontextprotocol.io) lists it as current or recent. Dropping one is a
`Removed` entry in the CHANGELOG, never a silent change. [MCP Protocol](/developers/mcp-protocol)
has the version list and the per-era differences.

For stdio clients this is somebody else's problem: the bundled `tablepro-mcp` bridge answers the
client's `initialize` locally and speaks the newest version upstream. See
[MCP Clients](/integrations/mcp-clients).

## Stability rules

Within a major TablePro version every covered surface is additive only. Per surface, that means:

### Links and database URLs

* A `tablepro://` path or parameter is never removed and never changes meaning.
* A [settings pane id](/developers/url-scheme#open-a-settings-pane) is never removed and keeps
  opening the same pane, whatever the pane is called.
* On iPhone and iPad, `connect/<uuid>` and `connect/<uuid>/table/<name>` keep working. Any other
  path under a connection opens the connection alone.
* A scheme on [Connection URLs](/connections/urls) keeps opening the same database type, and a
  documented query parameter keeps its meaning.
* A database URL's parameter names match in any case. An unknown one is ignored, except on MongoDB,
  where it is passed to the driver. `tablepro://` parameter names are case-sensitive.

### AppleScript

* A class, property, command, parameter or enumerator is never removed or renamed, and its
  four-character code never changes.
* A record a command returns keeps its fields. New fields can appear.

### MCP and pairing

* New tools, resources, prompts and error codes can appear.
* A new tool input field can appear when it is optional and has a default.
* A new tool output field can appear.
* A new pairing parameter can appear when it is optional.
* A token scope keeps its name and what it grants. `connections:display` only ever widens what
  `list_connections` returns for `purpose: "display"`, never what any tool can run.

And within a major version, none of these happen:

* A tool or prompt is removed or renamed.
* A required input field is added to an existing tool.
* An output field is removed or changes type.
* A resource is removed.
* `/mcp` or `/v1/integrations/exchange` moves.
* A pairing parameter is removed, or the redirect changes how it delivers the code.
* A scope is removed or renamed, or the exchange response drops `scope`.
* The default port changes from `23508`.

Error codes are the one place this already moved. TablePro's own codes left the `-32000` block, which
the specification froze, for `-33000` and above; a client that matched on the old numbers needs
updating once. The current table is in [MCP Protocol](/developers/mcp-protocol#errors).

The default port is not the port on every Mac. The user can set another under
**Settings > MCP**, and when `23508` is taken at start the server binds a free port instead.
Treat the port as a setting that defaults to `23508`; the pane's **Status** row shows the one in use.

### The tablepro command and the app's identity

* `tablepro`, once installed from **Settings > General**, stays at `/usr/local/bin/tablepro` and
  hands each argument to the app the way `open -b com.TablePro` does: database URLs, `tablepro://`
  links, `.sql` files and database files. With no argument it opens the app.
* The bundle ID stays `com.TablePro`.
* The MCP bridge stays at `Contents/MacOS/tablepro-mcp` inside the app bundle.
* Where the bundle sits is up to the user. [Find the app](/developers#find-the-app) by bundle ID.

## Breaking changes before 1.0

The app is on 0.x, so the minor version is the release boundary. A break can land between 0.67 and
0.68, but never silently. Once 1.0 ships, breaks move to major bumps.

Anything deprecated is deprecated in the docs first, with the replacement named and a CHANGELOG
entry to match. It then keeps working for at least one more minor version. A later release removes
it, marked `BREAKING` in the CHANGELOG.

Deprecated now:

* Pairing links without `response_mode`. Send `response_mode=query`, or `response_mode=context` for a
  host that takes one `context` launch parameter. See [Response modes](/developers/pairing#response-modes).

## What is not under the contract

These can change in any release, without notice:

* Transport framing, internal message routing, and any HTTP path other than `/mcp` and
  `/v1/integrations/exchange`.
* The handshake file at `~/Library/Application Support/TablePro/mcp-handshake.json`. Use the bundled
  `tablepro-mcp` bridge, which finds the server on its own, or connect over HTTP to the port on the
  **Status** row in **Settings > MCP**, `23508` by default.
* The connections file at `~/Library/Application Support/TablePro/connections.json`. List
  connections with `list_connections` or AppleScript instead.
* The preferences in `~/Library/Preferences/com.TablePro.plist`, including the connection groups
  and tags kept there.
* Keychain items the app writes, such as connection passwords and token hashes.
* The app's SQLite databases. Read query history with `search_query_history`, and the audit log at
  `mcp-audit.db` in the **MCP Activity** window.
* Token storage. Tokens are managed in **Settings > MCP**.
* Where the app is installed.

The [directory](/developers/listing-policy#rules) refuses an integration that reads the files,
preferences, Keychain items or databases on this list.

## Reporting a contradiction

File an issue at [github.com/TableProApp/TablePro](https://github.com/TableProApp/TablePro/issues)
with the TablePro version, the call, expected and actual behavior, and the matching activity log row
if there is one.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.