{"openapi":"3.1.0","info":{"title":"Tulip (BYOK) API","version":"0.1.0","description":"Tulip (BYOK) lets an AI assistant read your own Tulip data through the Tulip API with a key you supply (Tulip API token key (API key)). Read-only: 8 tools (list_stations, list_station_groups, list_interfaces, list_roles, list_user_groups, list_app_groups, list_machine_types, list_tables). The BYOK key travels with each request, is used for that one call only and is never stored, logged or cached;...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-tulip.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-tulip/docs"},"termsOfService":"https://connectorbay.com/byok-tulip/terms"},"servers":[{"url":"https://byok-tulip.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-tulip/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/list_stations":{"post":{"operationId":"list_stations","summary":"List Tulip stations with name, description, app execution state, station group, time zone and last-modified time. Use fo","description":"List Tulip stations with name, description, app execution state, station group, time zone and last-modified time. Use for \"Which Tulip stations do we have and which station group is each in\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"instance":{"description":"Your Tulip instance subdomain, the first part of <instance>.tulip.co.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Instance","type":"string"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"Items per page.","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of items to skip before collecting results.","title":"Offset"},"search":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Match on name.","title":"Search"},"sort":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Sort by name, lastModified.at or created.at, comma separated; prefix a field with - for descending.","title":"Sort"},"archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to list archived items instead of the active ones.","title":"Archived"},"filter":{"anyOf":[{"maxLength":120,"type":"string"},{"type":"null"}],"default":null,"description":"OData filter on station group, e.g. stationGroupId eq 'abc123' (only eq is supported).","title":"Filter"}},"required":["instance"],"title":"list_stationsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_station_groups":{"post":{"operationId":"list_station_groups","summary":"List Tulip station groups with name, description, parent group and last-modified time. Use for \"How are our Tulip statio","description":"List Tulip station groups with name, description, parent group and last-modified time. Use for \"How are our Tulip stations grouped\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"instance":{"description":"Your Tulip instance subdomain, the first part of <instance>.tulip.co.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Instance","type":"string"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"Items per page.","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of items to skip before collecting results.","title":"Offset"},"search":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Match on name.","title":"Search"},"sort":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Sort by name, lastModified.at or created.at, comma separated; prefix a field with - for descending.","title":"Sort"},"archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to list archived items instead of the active ones.","title":"Archived"},"filter":{"anyOf":[{"maxLength":120,"type":"string"},{"type":"null"}],"default":null,"description":"OData filter on parent group, e.g. parentStationGroupId eq 'abc123' (only eq is supported).","title":"Filter"}},"required":["instance"],"title":"list_station_groupsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_interfaces":{"post":{"operationId":"list_interfaces","summary":"List Tulip interfaces (computer or mobile devices running Tulip Player) with name, type, assigned station and last-modif","description":"List Tulip interfaces (computer or mobile devices running Tulip Player) with name, type, assigned station and last-modified time. Use for \"Which devices are registered as Tulip interfaces and where are they assigned\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"instance":{"description":"Your Tulip instance subdomain, the first part of <instance>.tulip.co.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Instance","type":"string"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"Items per page.","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of items to skip before collecting results.","title":"Offset"},"sort":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Sort by name, lastModified.at or created.at, comma separated; prefix a field with - for descending.","title":"Sort"},"filter":{"anyOf":[{"maxLength":120,"type":"string"},{"type":"null"}],"default":null,"description":"OData filter on station, e.g. stationId eq 'abc123' or stationId eq null (only eq is supported).","title":"Filter"}},"required":["instance"],"title":"list_interfacesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_roles":{"post":{"operationId":"list_roles","summary":"List Tulip user roles (built-in and custom) with name, description and custom flag. Use for \"What user roles exist in ou","description":"List Tulip user roles (built-in and custom) with name, description and custom flag. Use for \"What user roles exist in our Tulip instance\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"instance":{"description":"Your Tulip instance subdomain, the first part of <instance>.tulip.co.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Instance","type":"string"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"Items per page.","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of items to skip before collecting results.","title":"Offset"},"search":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Match on name.","title":"Search"},"archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to list archived items instead of the active ones.","title":"Archived"},"filter":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"OData filter on the isCustom field, e.g. isCustom eq true.","title":"Filter"}},"required":["instance"],"title":"list_rolesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_user_groups":{"post":{"operationId":"list_user_groups","summary":"List Tulip user groups with name, description and the number of assigned users (no member names). Use for \"Which Tulip u","description":"List Tulip user groups with name, description and the number of assigned users (no member names). Use for \"Which Tulip user groups exist and how many users are in each\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"instance":{"description":"Your Tulip instance subdomain, the first part of <instance>.tulip.co.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Instance","type":"string"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"Items per page.","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of items to skip before collecting results.","title":"Offset"},"search":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Match on name.","title":"Search"},"archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to list archived items instead of the active ones.","title":"Archived"}},"required":["instance"],"title":"list_user_groupsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_app_groups":{"post":{"operationId":"list_app_groups","summary":"List Tulip app groups (folders) and the apps they contain, with app name, type and published flag. Use for \"Which apps a","description":"List Tulip app groups (folders) and the apps they contain, with app name, type and published flag. Use for \"Which apps are in each Tulip app group and which are published\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"instance":{"description":"Your Tulip instance subdomain, the first part of <instance>.tulip.co.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Instance","type":"string"}},"required":["instance"],"title":"list_app_groupsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_machine_types":{"post":{"operationId":"list_machine_types","summary":"List Tulip machine types with the machines (id and name) defined for each type. Use for \"Which machine types and machine","description":"List Tulip machine types with the machines (id and name) defined for each type. Use for \"Which machine types and machines are set up in Tulip\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"instance":{"description":"Your Tulip instance subdomain, the first part of <instance>.tulip.co.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Instance","type":"string"}},"required":["instance"],"title":"list_machine_typesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_tables":{"post":{"operationId":"list_tables","summary":"List Tulip Tables with label, description, created and updated time and column definitions (no records). Use for \"Which ","description":"List Tulip Tables with label, description, created and updated time and column definitions (no records). Use for \"Which Tulip Tables exist and what columns do they have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"instance":{"description":"Your Tulip instance subdomain, the first part of <instance>.tulip.co.","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Instance","type":"string"},"limit":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"Maximum number of tables to return.","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of tables to skip.","title":"Offset"},"include_deleted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include deleted tables.","title":"Include Deleted"}},"required":["instance"],"title":"list_tablesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}