mirror of
https://github.com/fabro-sh/fabro.git
synced 2026-09-24 00:51:19 +00:00
## 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>
113 lines
3.3 KiB
TOML
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"] }
|