Skip to main content
TroopyDocs
Open Troopy
Troopy

API reference / Apps

Add a custom app

Adds a remote MCP server, by the https address of its Streamable HTTP endpoint (SSE servers are refused), and lists its tools at once, 40 at most. With key, Troopy sends it in Authorization as a Bearer token, or in header. A server that asks for a sign-in waits for one: its status is needs_sign_in, and a person opens signIn in a browser. A tool that the server marks read-only runs when a teammate calls it. Each other tool waits for the yes of an owner or admin. A workspace adds 10 apps. Needs an owner or admin.

post/api/v1/custom-apps

Authorization

HeaderAuthorization: Bearer <API key>
Or the headerX-API-Key: <API key>
API keyMake one in Troopy under Settings > API keys. It acts as you, in its workspace.

Other ways to call it

CLItroopy custom-apps add
MCP toolNone. Call it over REST or with the CLI.
Rate limit10 calls in 60 seconds, for each key

Body

application/json
name*string

Its name, as in Acme CRM. Its id comes from it

At least 2 characters · At most 60 characters

url*string

The https address of the MCP server, as in https://mcp.acme.example/mcp

At most 500 characters

keystring

A key that the server gave you

At least 8 characters · At most 2000 characters

headerstring

The header that carries the key, as in X-API-Key. Without it: Authorization, with Bearer

kindenum<string>

openapi (Liquid SaaS): url is a JSON OpenAPI 3 document, and each operation is a tool, on the host of the document

mcpopenapi

Default "mcp"

Response

200 · application/json
data*object
12 properties
slug*string

The id of the app, made from its name, as in acme_crm

name*string
kind*enum<string>

A remote MCP server, or an OpenAPI document (Liquid SaaS)

mcpopenapi

url*string

The Streamable HTTP address of its MCP server

auth*enum<string>

How Troopy signs in: nothing, a key in a header, or the sign-in of the server

nonekeyoauth

status*enum<string>

connectedneeds_sign_infailed

error*string | null
tools*array<object>
5 properties
name*string
description*string
mode*enum<string>

free: it runs. ask: it waits for the yes of an owner or admin. off: no teammate calls it

freeaskoff

args*array<string>

The top-level arguments of the tool

visitor*string | null

The argument that takes the email of a visitor of the website. Then the Support agent calls the tool for a visitor that the website proved, and Troopy fills that argument in. Null: the Support agent never calls it

listedAt*string | null

When an owner or admin last read its tools

connectedBy*object

Who wrote it

3 properties
type*enum<string>

personagentapi

id*string
name*string
connectedAt*string

ISO 8601 date and time

signIn*string | null

The page that starts the sign-in of the server, while it waits for one. A person opens it

Errors

400 invalid_inputFix the field named in detail. Each operation's schema is in /api/v1/openapi.json.
401 unauthorizedSend an API key as `Authorization: Bearer tr_live_...`. Create one in Troopy under Settings.
403 forbiddenThe key lacks a scope this operation needs, or its owner lacks the role. detail says which; create a key with the scope, or ask an organization owner or admin.
429 rate_limitedWait the number of seconds in Retry-After, then retry.