Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
30ca137
Add the capability registry tool surface
sarve-shreyas Aug 19, 2026
a0f5a20
Wire the capability registry into the server factory
sarve-shreyas Aug 19, 2026
034b2c2
Resolve base_url the way Atlas does, and stop hardcoding the TM host
sarve-shreyas Aug 19, 2026
000229f
Support multiple environments for base_url, mirroring Atlas
sarve-shreyas Aug 19, 2026
43eba70
Return the product's response instead of interpreting it
sarve-shreyas Aug 19, 2026
2f3d194
Ask BrowserStack AI, and relay its permission asks to the human
sarve-shreyas Aug 24, 2026
5091263
Align to the verified Atlas response, and frame the prompt
sarve-shreyas Aug 24, 2026
2628aa4
Authenticate /agent the way /agent actually authenticates
sarve-shreyas Aug 24, 2026
57be2d7
Stop claiming the approval channel was used when nothing was asked
sarve-shreyas Aug 24, 2026
8584c13
Read the approval trail from Atlas instead of guessing at it
sarve-shreyas Aug 24, 2026
aebf512
Let the body decide whether a run happened, not the HTTP status
sarve-shreyas Aug 24, 2026
6026201
Sign in with a central JWT instead of a shared secret
sarve-shreyas Aug 24, 2026
df77700
Request ai_agent_notify, and fail loudly if it will not be issued
sarve-shreyas Aug 24, 2026
8067a0d
Let the approve button approve
sarve-shreyas Aug 25, 2026
9e07674
Ask nothing in the form, and let the action be the answer
sarve-shreyas Aug 25, 2026
20b2dcf
Let TM region discovery be pointed at a non-production environment
sarve-shreyas Aug 25, 2026
bc61dd9
Do not attempt the approval relay in the hosted deployment
sarve-shreyas Aug 26, 2026
420c20e
Ship the Atlas hosts, so an install needs a name and not a URL
sarve-shreyas Aug 26, 2026
ec58c62
Hardcode one staging host, and say loudly that it is temporary
sarve-shreyas Aug 26, 2026
2de13db
Tell the user when AI is not enabled for their account
sarve-shreyas Aug 26, 2026
3ec33ca
Take the capability registry out of this release
sarve-shreyas Aug 26, 2026
d6f5281
Say in the description that this is the fallback
sarve-shreyas Aug 26, 2026
792461f
feat(ask): A1 stream transport — nothing dials in
sarve-shreyas Aug 26, 2026
fb17e70
feat(ask): wire the tool onto A1 — no port, no callback, no NAT problem
sarve-shreyas Aug 26, 2026
9f39eec
fix(ask): stop claiming a person answered when nobody was there
sarve-shreyas Aug 26, 2026
ed04fa8
Stop reporting a 5xx from auth as rejected credentials
sarve-shreyas Aug 26, 2026
c307c32
Remove the A2 callback transport from the MCP half
sarve-shreyas Aug 26, 2026
a593ebc
Stop claiming Atlas route-checks the approval description
sarve-shreyas Aug 27, 2026
8b7f625
Merge origin/main into askrelay/central-mcp
sarve-shreyas Aug 27, 2026
3e16fab
feat(ask): the hosted deployment may offer the relay, when it opts in
sarve-shreyas Aug 27, 2026
49a30c9
fix(ask): route each elicitation onto the tool call's own stream
sarve-shreyas Aug 27, 2026
fa11a3a
askBrowserstackAI: point the compiled defaults at production
sarve-shreyas Aug 27, 2026
349d5b1
feat(tools): declare preconditions, so a missing id becomes a handoff
sarve-shreyas Aug 31, 2026
4dd5daa
Merge pull request #381 from browserstack/feat/tool-preconditions
sarve-shreyas Aug 31, 2026
3804277
Merge remote-tracking branch 'origin/main' into askrelay/central-mcp
sarve-shreyas Sep 1, 2026
3c4b35d
remove the TM base-URL override — it was a test harness, not a feature
sarve-shreyas Sep 1, 2026
ac79d1a
fix: the exit handler must not be the thing that throws
sarve-shreyas Sep 1, 2026
ca03ab2
1.3.1 -> 1.4.0
sarve-shreyas Sep 1, 2026
0889523
rename the tool askBrowserstackAI -> askBrowserStackAI
sarve-shreyas Sep 2, 2026
91d4126
alpha framing: title, description and the not-entitled copy
sarve-shreyas Sep 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@browserstack/mcp-server",
"version": "1.3.1",
"version": "1.4.0",
"description": "BrowserStack's Official MCP Server",
"mcpName": "io.github.browserstack/mcp-server",
"main": "dist/index.js",
Expand Down
7 changes: 5 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,12 @@ async function main() {

main().catch(console.error);

// Ensure logs are flushed before exit
// Ensure logs are flushed before exit. Optional-called because an exit handler must not
// be the thing that throws: `flush` is absent from every `vi.mock("src/logger")` in the
// suite, so any test file that loads this module used to fail the run with
// `default.flush is not a function` depending on how vitest scheduled workers.
process.on("exit", () => {
logger.flush();
logger.flush?.();
});

export { setLogger } from "./logger.js";
Expand Down
5 changes: 5 additions & 0 deletions src/server-factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import addBuildInsightsTools from "./tools/build-insights.js";
import { setupOnInitialized } from "./oninitialized.js";
import { BrowserStackConfig } from "./lib/types.js";
import addRCATools from "./tools/rca-agent.js";
import addAskBrowserStackAITool from "./tools/ask-browserstack/register.js";

/**
* Wrapper class for BrowserStack MCP Server
Expand Down Expand Up @@ -61,6 +62,10 @@ export class BrowserStackMcpServer {
addSelfHealTools,
addBuildInsightsTools,
addRCATools,
// Hands a plain-language task to BrowserStack's agent and relays its mid-run
// permission asks back to this client, so a write can be confirmed by the human
// sitting in front of it rather than refused for want of anyone to ask.
addAskBrowserStackAITool,
];

toolAdders.forEach((adder) => {
Expand Down
7 changes: 5 additions & 2 deletions src/tools/accessibility.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { getBrowserStackAuth } from "../lib/get-auth.js";
import { BrowserStackConfig } from "../lib/types.js";
import { elicitCredentialsIfSupported } from "../lib/elicit-credentials.js";
import logger from "../logger.js";
import { NEEDS_A11Y_CONFIG_ID, NEEDS_A11Y_SCAN_ID } from "./tool-handoff.js";

interface AuthCredentials {
username: string;
Expand Down Expand Up @@ -575,7 +576,8 @@ export default function addAccessibilityTools(

tools.getAccessibilityAuthConfig = server.tool(
"getAccessibilityAuthConfig",
"Retrieve an existing authentication configuration by ID.",
"Retrieve an existing authentication configuration by ID." +
NEEDS_A11Y_CONFIG_ID,
{
configId: z.number().describe("ID of the auth configuration to retrieve"),
},
Expand All @@ -593,7 +595,8 @@ export default function addAccessibilityTools(

tools.fetchAccessibilityIssues = server.tool(
"fetchAccessibilityIssues",
"Fetch accessibility issues from a completed scan with pagination support. Use cursor parameter to get subsequent pages of results.",
"Fetch accessibility issues from a completed scan with pagination support. Use cursor parameter to get subsequent pages of results." +
NEEDS_A11Y_SCAN_ID,
{
scanId: z
.string()
Expand Down
Loading