Skip to content

Commit a4f8713

Browse files
author
Lasim
committed
feat(backend): implement toggle tool status route for MCP installations
1 parent a1b8088 commit a4f8713

File tree

10 files changed

+6290
-1
lines changed

10 files changed

+6290
-1
lines changed

services/backend/api-spec.json

Lines changed: 255 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12120,6 +12120,10 @@
1212012120
"type": "number",
1212112121
"description": "Token count for this tool"
1212212122
},
12123+
"is_disabled": {
12124+
"type": "boolean",
12125+
"description": "Whether the tool is disabled by team admin"
12126+
},
1212312127
"discovered_at": {
1212412128
"type": "string",
1212512129
"description": "ISO 8601 timestamp when tool was discovered"
@@ -12135,6 +12139,7 @@
1213512139
"description",
1213612140
"input_schema",
1213712141
"token_count",
12142+
"is_disabled",
1213812143
"discovered_at",
1213912144
"updated_at"
1214012145
]
@@ -12564,6 +12569,256 @@
1256412569
}
1256512570
}
1256612571
},
12572+
"/api/teams/{teamId}/mcp/installations/{installationId}/tools/{toolId}": {
12573+
"patch": {
12574+
"summary": "Toggle tool disabled status",
12575+
"tags": [
12576+
"MCP Tools"
12577+
],
12578+
"description": "Enable or disable an MCP tool for a specific installation. When disabled, the satellite will return an LLM-friendly error message. Requires mcp.tools.manage permission (team_admin or global_admin).",
12579+
"requestBody": {
12580+
"content": {
12581+
"application/json": {
12582+
"schema": {
12583+
"type": "object",
12584+
"properties": {
12585+
"is_disabled": {
12586+
"type": "boolean",
12587+
"description": "Whether to disable (true) or enable (false) the tool"
12588+
}
12589+
},
12590+
"required": [
12591+
"is_disabled"
12592+
],
12593+
"additionalProperties": false
12594+
}
12595+
}
12596+
},
12597+
"required": true
12598+
},
12599+
"parameters": [
12600+
{
12601+
"schema": {
12602+
"type": "string",
12603+
"minLength": 1
12604+
},
12605+
"in": "path",
12606+
"name": "teamId",
12607+
"required": true,
12608+
"description": "Team ID that owns the installation"
12609+
},
12610+
{
12611+
"schema": {
12612+
"type": "string",
12613+
"minLength": 1
12614+
},
12615+
"in": "path",
12616+
"name": "installationId",
12617+
"required": true,
12618+
"description": "Installation ID"
12619+
},
12620+
{
12621+
"schema": {
12622+
"type": "string",
12623+
"minLength": 1
12624+
},
12625+
"in": "path",
12626+
"name": "toolId",
12627+
"required": true,
12628+
"description": "Tool metadata ID"
12629+
}
12630+
],
12631+
"security": [
12632+
{
12633+
"cookieAuth": []
12634+
}
12635+
],
12636+
"responses": {
12637+
"200": {
12638+
"description": "Tool status updated successfully",
12639+
"content": {
12640+
"application/json": {
12641+
"schema": {
12642+
"type": "object",
12643+
"properties": {
12644+
"success": {
12645+
"type": "boolean",
12646+
"description": "Indicates if the operation was successful"
12647+
},
12648+
"data": {
12649+
"type": "object",
12650+
"properties": {
12651+
"tool_id": {
12652+
"type": "string",
12653+
"description": "Tool metadata unique identifier"
12654+
},
12655+
"tool_name": {
12656+
"type": "string",
12657+
"description": "Name of the tool"
12658+
},
12659+
"is_disabled": {
12660+
"type": "boolean",
12661+
"description": "Current disabled status"
12662+
},
12663+
"command_id": {
12664+
"type": "string",
12665+
"description": "Satellite command ID for tracking"
12666+
},
12667+
"message": {
12668+
"type": "string",
12669+
"description": "Human-readable status message"
12670+
}
12671+
},
12672+
"required": [
12673+
"tool_id",
12674+
"tool_name",
12675+
"is_disabled",
12676+
"message"
12677+
]
12678+
}
12679+
},
12680+
"required": [
12681+
"success",
12682+
"data"
12683+
],
12684+
"description": "Tool status updated successfully"
12685+
}
12686+
}
12687+
}
12688+
},
12689+
"401": {
12690+
"description": "Unauthorized - Authentication required",
12691+
"content": {
12692+
"application/json": {
12693+
"schema": {
12694+
"type": "object",
12695+
"properties": {
12696+
"success": {
12697+
"type": "boolean",
12698+
"default": false,
12699+
"description": "Indicates failure"
12700+
},
12701+
"error": {
12702+
"type": "string",
12703+
"description": "Error message detailing what went wrong"
12704+
}
12705+
},
12706+
"required": [
12707+
"success",
12708+
"error"
12709+
],
12710+
"description": "Unauthorized - Authentication required"
12711+
}
12712+
}
12713+
}
12714+
},
12715+
"403": {
12716+
"description": "Forbidden - Insufficient permissions or not a team member",
12717+
"content": {
12718+
"application/json": {
12719+
"schema": {
12720+
"type": "object",
12721+
"properties": {
12722+
"success": {
12723+
"type": "boolean",
12724+
"default": false,
12725+
"description": "Indicates failure"
12726+
},
12727+
"error": {
12728+
"type": "string",
12729+
"description": "Error message detailing what went wrong"
12730+
}
12731+
},
12732+
"required": [
12733+
"success",
12734+
"error"
12735+
],
12736+
"description": "Forbidden - Insufficient permissions or not a team member"
12737+
}
12738+
}
12739+
}
12740+
},
12741+
"404": {
12742+
"description": "Not Found - Tool or installation does not exist",
12743+
"content": {
12744+
"application/json": {
12745+
"schema": {
12746+
"type": "object",
12747+
"properties": {
12748+
"success": {
12749+
"type": "boolean",
12750+
"default": false,
12751+
"description": "Indicates failure"
12752+
},
12753+
"error": {
12754+
"type": "string",
12755+
"description": "Error message detailing what went wrong"
12756+
}
12757+
},
12758+
"required": [
12759+
"success",
12760+
"error"
12761+
],
12762+
"description": "Not Found - Tool or installation does not exist"
12763+
}
12764+
}
12765+
}
12766+
},
12767+
"500": {
12768+
"description": "Internal Server Error",
12769+
"content": {
12770+
"application/json": {
12771+
"schema": {
12772+
"type": "object",
12773+
"properties": {
12774+
"success": {
12775+
"type": "boolean",
12776+
"default": false,
12777+
"description": "Indicates failure"
12778+
},
12779+
"error": {
12780+
"type": "string",
12781+
"description": "Error message detailing what went wrong"
12782+
}
12783+
},
12784+
"required": [
12785+
"success",
12786+
"error"
12787+
],
12788+
"description": "Internal Server Error"
12789+
}
12790+
}
12791+
}
12792+
},
12793+
"503": {
12794+
"description": "Service Unavailable - No active satellite available",
12795+
"content": {
12796+
"application/json": {
12797+
"schema": {
12798+
"type": "object",
12799+
"properties": {
12800+
"success": {
12801+
"type": "boolean",
12802+
"default": false,
12803+
"description": "Indicates failure"
12804+
},
12805+
"error": {
12806+
"type": "string",
12807+
"description": "Error message detailing what went wrong"
12808+
}
12809+
},
12810+
"required": [
12811+
"success",
12812+
"error"
12813+
],
12814+
"description": "Service Unavailable - No active satellite available"
12815+
}
12816+
}
12817+
}
12818+
}
12819+
}
12820+
}
12821+
},
1256712822
"/api/teams/{teamId}/satellites": {
1256812823
"get": {
1256912824
"summary": "Get available satellites for team",

0 commit comments

Comments
 (0)