fabro/lib/crates/fabro-server/Cargo.toml
Bryan Helmkamp a19f6dd03a
feat(cli): add Fabro MCP server (#236)
## Summary

Adds a stdio-based Fabro MCP server so MCP clients can manage Fabro
workflow runs through the authenticated `fabro` CLI, without a separate
MCP auth flow.

## What Changed

- Adds `fabro mcp start`, `fabro mcp config`, and `fabro mcp init
<agent>` for launching and configuring the MCP server.
- Introduces a new `fabro-mcp-server` crate with run-management tools:
  - `fabro_run_create`
  - `fabro_run_search`
  - `fabro_run_interact`
  - `fabro_run_gather`
  - `fabro_run_events`
- Reuses the CLI's authenticated server connection behavior, including
OAuth refresh, dev-token/local-server handling, explicit server targets,
proxy behavior, and stdio env/cwd isolation.
- Moves shared run-manifest construction into `fabro-manifest` so CLI
runs and MCP-created runs use the same override semantics.
- Extends MCP client stdio support with configured cwd and exact
environment handling for reliable spawned-server tests.

---------

Co-authored-by: fabro-sh-0530[bot] <281434857+fabro-sh-0530[bot]@users.noreply.github.com>
Co-authored-by: Fabro <noreply@fabro.sh>
2026-05-11 18:20:50 -04:00

113 lines
3.3 KiB
TOML

[package]
name = "fabro-server"
edition.workspace = true
version.workspace = true
publish = false
license.workspace = true
description = "HTTP server for Fabro pipelines"
[lib]
doctest = false
[features]
test-support = []
[[test]]
name = "it"
path = "tests/it/main.rs"
required-features = ["test-support"]
[lints]
workspace = true
[dependencies]
fabro-auth = { path = "../fabro-auth" }
fabro-install = { path = "../fabro-install" }
fabro-spa = { path = "../fabro-spa" }
fabro-config = { path = "../fabro-config" }
fabro-graphviz = { path = "../fabro-graphviz" }
fabro-hooks = { path = "../fabro-hooks" }
fabro-interview = { path = "../fabro-interview" }
fabro-slack = { path = "../fabro-slack" }
fabro-workflow = { path = "../fabro-workflow" }
fabro-validate = { path = "../fabro-validate" }
fabro-sandbox = { path = "../fabro-sandbox", features = ["daytona", "docker"] }
fabro-github = { path = "../fabro-github" }
fabro-agent = { path = "../fabro-agent" }
fabro-llm = { path = "../fabro-llm" }
fabro-manifest = { path = "../fabro-manifest" }
fabro-model = { path = "../fabro-model" }
fabro-proc = { path = "../fabro-proc" }
fabro-types = { path = "../fabro-types" }
fabro-util = { path = "../fabro-util" }
fabro-api = { path = "../fabro-api" }
fabro-store = { path = "../fabro-store" }
fabro-vault = { path = "../fabro-vault" }
fabro-http.workspace = true
fabro-redact.workspace = true
fabro-static.workspace = true
chrono.workspace = true
futures-util.workspace = true
axum = { workspace = true, features = ["ws"] }
axum-extra.workspace = true
cookie.workspace = true
dirs.workspace = true
globset.workspace = true
tower = "0.5"
tower-http = { version = "0.6", features = ["trace"] }
tokio-stream = { workspace = true, features = ["sync"] }
tokio-util.workspace = true
base64.workspace = true
jsonwebtoken.workspace = true
hkdf.workspace = true
tokio.workspace = true
serde.workspace = true
serde_json.workspace = true
serde_yaml = "0.9"
anyhow.workspace = true
clap.workspace = true
toml.workspace = true
toml_edit.workspace = true
tracing.workspace = true
ulid.workspace = true
uuid.workspace = true
hmac.workspace = true
sha2.workspace = true
hex.workspace = true
rand.workspace = true
bytes = "1"
tempfile = "3"
object_store.workspace = true
# reqwest 0.12 is a direct dep only so `NoProxyReqwestConnector` can build a
# `reqwest::Client` of the version object_store accepts. Rest of the crate
# talks to HTTP via fabro-http (reqwest 0.13).
object_store_reqwest = { package = "reqwest", version = "0.12", default-features = false, features = ["rustls-tls-native-roots"] }
mime_guess.workspace = true
regex.workspace = true
semver.workspace = true
walkdir.workspace = true
multer = "3"
thiserror.workspace = true
ipnet = "2.11.0"
percent-encoding.workspace = true
url = "2"
zeroize.workspace = true
strum.workspace = true
[build-dependencies]
fabro-build-support = { path = "../build-support" }
chrono = { workspace = true }
[dev-dependencies]
tokio = { workspace = true, features = ["test-util", "macros"] }
tower = "0.5"
http-body-util = "0.1"
httpmock = "0.8"
serde_yaml = "0.9"
tracing-subscriber.workspace = true
async-trait.workspace = true
tokio-util.workspace = true
fabro-macros = { path = "../fabro-macros" }
fabro-sandbox = { path = "../fabro-sandbox", features = ["test-support"] }
fabro-test = { workspace = true }
fabro-types = { path = "../fabro-types", features = ["test-support"] }