Bifrost in your editor
Bifrost ships a Model Context Protocol (MCP) server. Point VS Code agent mode (or any MCP client) at it and your AI assistant can read the whole migration picture — and, on the roadmap, convert a pipeline to a GitHub Actions workflow — grounded in the official GitHub Importer, never hallucinated.
What MCP gives you here
MCP is a standard way for an AI assistant to call
external tools. VS Code, Cursor, Claude Desktop and the GitHub Copilot coding agent all
speak it. The Bifrost MCP server (bifrost-mcp) is a small stdio JSON-RPC process that
proxies the Bifrost control-plane API, so an assistant in your editor gets the same
deterministic answers the portal shows — risk, forecast, coverage, readiness, the program
board — as structured tool results it can reason over.
The point is grounding. Ask a generic assistant “rewrite this Azure Pipelines YAML as a
GitHub workflow” and it guesses from training data. Ask it through Bifrost and it runs the
official gh actions-importer, reads the real conversion output and the specific
unsupported steps, and explains the gap from that — the same review-first, attestable path
the portal uses.
Tools available today
Read-only context
These give an assistant full situational awareness without the power to change anything. Every one is a deterministic read.
| Tool | What it answers |
|---|---|
bifrost_portfolio |
Every pipeline with project, classification (YAML/classic), risk band + score, converted ratio, proposal status. |
bifrost_assessment |
Source (Azure DevOps) assessment: pipeline mix, risk distribution, inventory density (service connections, variable groups, secrets, runners, custom tasks). |
bifrost_coverage |
The completeness matrix: each ADO moving-part category mapped to its GitHub equivalent and a status (auto / review / manual / not-inventoried). |
bifrost_forecast |
Deterministic GitHub Actions cost + capacity forecast for the target org. |
bifrost_readiness |
Target GitHub pre-flight checklist: runners, Actions policy, OIDC federation, secrets, rulesets, ownership, rollback. |
bifrost_program_board |
The dry-run plan of the GitHub Projects program board: dedicated repo, org Project, fields, one issue per pipeline, KPIs. |
bifrost_report |
The pre-migration status report (Markdown), optionally scoped to one project. |
validate_workflow |
A quick structural sanity check on a workflow YAML (has on: and jobs:). Local; no API call. |
Lifecycle (review-first)
These move a pipeline along the migration, each grounded in the same review-first engine the
portal uses. None of them merges anything: convert and runbook produce/read a proposal,
and commit is gated three ways (see below).
| Tool | What it does |
|---|---|
bifrost_convert |
Convert a pipeline to a proposed GitHub workflow (Importer dry-run + grounded gap-fill). Returns a Proposal + Runbook. Idempotent. Never commits or opens a PR. |
bifrost_runbook |
Read a proposal’s manual-task checklist — secrets to create, service connections to federate via OIDC, runners to label — each with required/done state. Read-only. |
bifrost_commit |
Open the PR for an approved proposal. Disabled unless BIFROST_MCP_COMMIT=1; the proposal must already be approved in the portal; a real PR only with BIFROST_COMMIT_LIVE (else a mock URL). |
The context tools never touch production CI. The lifecycle tools stay review-first: an assistant can take you from legacy YAML to a reviewed, approved, committed workflow, but approval is always a human decision made in the portal — never from the editor.
Set it up in VS Code
VS Code reads MCP servers from .vscode/mcp.json in your workspace (committable, so the
whole team gets it) or your user profile. The root key is servers — note that Cursor
and Claude Desktop use mcpServers instead; copy-pasting their config is the number-one
setup mistake.
-
Build the server once:
cargo build -p bifrost-mcp -
Start the Bifrost API the server proxies (in another terminal):
cargo run -p bifrost-api -
Add
.vscode/mcp.json:{ "servers": { "bifrost": { "command": "${workspaceFolder}/target/debug/bifrost-mcp", "env": { "BIFROST_API_URL": "http://127.0.0.1:8080" } } } }stdiois implicit for a local command.BIFROST_API_URLdefaults tohttp://127.0.0.1:8080, so you can omitenvif you run the API there. -
Open Copilot Chat, switch the mode dropdown to Agent (MCP tools are invisible in Ask or Edit mode), and the Bifrost tools appear in the tools picker. VS Code asks you to confirm each tool call before it runs — that confirmation is your human gate.
The same server works in Cursor and Claude Desktop; only the config key differs
(mcpServers).
Other IDEs
bifrost-mcp is a standard stdio MCP server, so any MCP-capable client can use it. The only
differences are the file location and the top-level key.
Cursor
.cursor/mcp.json in the workspace (or ~/.cursor/mcp.json for all projects). Key is
mcpServers:
{
"mcpServers": {
"bifrost": {
"command": "/abs/path/to/target/debug/bifrost-mcp",
"env": { "BIFROST_API_URL": "http://127.0.0.1:8080" }
}
}
}
Then enable the server in Cursor’s MCP settings and use it from the agent (Composer).
Claude Desktop
Edit claude_desktop_config.json (~/Library/Application Support/Claude/ on macOS,
%APPDATA%/Claude/ on Windows), same mcpServers shape as Cursor, and restart the app.
Bifrost’s tools appear in the tools menu.
JetBrains (IntelliJ, Rider, PyCharm, WebStorm, …)
Use JetBrains AI Assistant’s MCP client (Settings → Tools → AI Assistant → Model Context
Protocol → add server), pointed at the bifrost-mcp binary as a stdio command with
BIFROST_API_URL in the environment. (Note: the JetBrains MCP server feature is the
reverse — it exposes the IDE to outside clients; to consume Bifrost you want the AI Assistant
client side.)
Whatever the client, the server is the same binary and the same review-first guarantees apply: context tools are read-only,
convertproduces a proposal, andcommitstays triple-gated (BIFROST_MCP_COMMIT, human approval,BIFROST_COMMIT_LIVE).
A real day with it
Priya, a platform engineer, is three weeks into migrating 180 Azure DevOps pipelines. She works entirely in VS Code agent mode.
“Which pipelines should my team take this sprint, and why?”
The assistant calls bifrost_portfolio and bifrost_program_board, sees the deterministic
wave assignment and risk bands, and answers: the twelve green YAML pipelines in Wave 1 —
low risk, no classic-designer tail — with the two amber ones flagged for a closer look. No
guessing; the waves come from Bifrost’s risk model.
“What’s going to bite us on the Payments-API pipeline?”
It calls bifrost_coverage and bifrost_assessment scoped to that project and reports the
real gaps: a DownloadSecureFile@1 task with no automatic equivalent, one service
connection to federate via OIDC, two secrets to recreate. These are the Importer’s findings,
surfaced as a checklist — not a generic “you may need to adjust secrets.”
“Draft the management update.”
bifrost_report returns the Markdown status report; the assistant trims it into a Slack
post. The numbers match the portal because they came from the same API.
Every one of those is possible today, read-only, inside the editor.
The headline: convert a pipeline in the editor
Here is the workflow you asked about — open a pipeline, ask Bifrost to migrate it, see the proposed GitHub workflow — and exactly how it fits the design.
The bifrost_convert tool exposes the conversion engine to your editor. It wraps
POST /api/pipelines/:id/convert, which runs the Importer dry-run, detects the gaps, fills
them with grounded LLM context, and returns a Proposal (the augmented workflow +
rationale + deterministic risk) plus a Runbook (the manual tasks the Importer cannot do
for you) — the same engine the portal drives through its three-pane review. So the whole
flow runs from your editor:
You (in VS Code, Payments-API azure-pipelines.yml open):
"Migrate this pipeline to a GitHub Actions workflow."
Assistant → bifrost_convert { pipelineId: "payments-api" }
Bifrost runs gh actions-importer dry-run, detects gaps, fills them
grounded in the source + the Importer output + the failure log.
Assistant ← Proposal:
- proposed .github/workflows/payments-api.yml
- rationale: what changed and why (e.g. DownloadSecureFile@1 → a
checkout of a secrets repo gated by OIDC)
- risk: Amber — one unsupported task gap-filled, verify manually
- runbook: [ federate azure-prod via OIDC, recreate NUGET_API_KEY,
label the self-hosted runner ]
You: review the diff in the editor, edit if needed, then approve.
Crucially, convert produces a proposal, not a merged PR. Committing the workflow and
opening the pull request stays a separate, explicitly-approved step
(POST /api/proposals/:id/commit), exactly as in the portal. The editor flow makes the
review faster; it does not remove the human from the loop.
This is the “perfect migration tool” idea, made real: the engineer opens the legacy pipeline, asks once, and gets a reviewable GitHub workflow with the conversion’s risks and manual follow-ups spelled out — without a hallucinated rewrite, because Bifrost wraps the official tool and explains the diff.
Reviewing and committing from the editor
Once a workflow is proposed, two more tools close the loop:
bifrost_runbook { pipelineId }reads the proposal’s manual-task checklist — the things the Importer cannot do for you (create secrets, federate service connections via OIDC, label self-hosted runners), each flagged required/optional and done/outstanding. An assistant can walk you through them, or generate theghcommands to resolve them.-
bifrost_commit { pipelineId }opens the pull request for an approved proposal. It is gated three ways, so an agent can never open a PR on its own:- Tool opt-in. Disabled unless the server is started with
BIFROST_MCP_COMMIT=1. By default the tool refuses and tells you how to enable it. - Human approval. The proposal must already be
approved— a decision made by a person in the review portal. The API rejects a commit in any other state, and there is no MCP tool that approves; the editor cannot self-approve. - Live write. Even when committing, a real GitHub PR is opened only if the control
plane runs with
BIFROST_COMMIT_LIVE; otherwise a mock PR URL is returned. So you can rehearse the whole flow with zero external effect.
- Tool opt-in. Disabled unless the server is started with
The default posture opens no pull requests and makes no GitHub write. Enabling
bifrost_commitis a deliberate operator choice, and even then it only acts on work a human has already approved.
How far does the automation go?
Bifrost’s hard rules set the ceiling deliberately, and they are what make the automation trustworthy at portfolio scale:
- Review-first. The assistant can take you from legacy YAML to a proposed workflow with risk and a runbook autonomously. The commit and the pull request remain human-approved. Auto-commit is opt-in and gated behind approval plus validation.
- Grounded generation only. Every conversion carries the source snippet, the Importer’s converted output and the specific failure from the log. The model fills the gap from that diff — it never converts a pipeline from scratch.
- The LLM explains; it does not score. Risk and cost are deterministic. The assistant can explain an Amber rating but cannot move it.
- Everything is attestable. Each state transition and human action is appended to an immutable audit log, whether it originated in the portal or the editor.
- Air-gap capable. Routing can force every model call to a local provider (Ollama), so the whole editor flow runs with no pipeline data leaving the box.
A realistic end state: a Copilot agent in a <org>-migration-program repo opens the next
Wave-1 pipeline, calls bifrost_convert, opens a draft PR with the proposed workflow plus the
runbook as a checklist, and stops — a human reviews, ticks off the manual tasks, and merges.
Bifrost turns “convert 180 pipelines by hand” into “review 180 grounded proposals,” in the
tools the team already uses.
Roadmap for the editor flow
| State | Status |
|---|---|
| Read-only context tools (portfolio, assessment, coverage, forecast, readiness, program board, report) | Shipped |
validate_workflow structural check |
Shipped |
bifrost_convert — convert a pipeline to a proposed workflow from the editor |
Shipped (wraps the review-first /convert endpoint) |
bifrost_runbook — read a proposal’s manual-task checklist |
Shipped |
Gated bifrost_commit — open the PR after approval |
Shipped (triple-gated, see below) |
The engine is built; extending the editor surface is mostly exposing it through MCP, one review-first tool at a time.