Skip to content

Commit 93cbf92

Browse files
Linloirandrew-lastmile
authored andcommitted
feat: support cwd configuration for stdio servers (lastmile-ai#562)
1 parent 4193a2f commit 93cbf92

File tree

7 files changed

+28
-0
lines changed

7 files changed

+28
-0
lines changed

schema/mcp-agent.config.schema.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -745,6 +745,19 @@
745745
"type": "array",
746746
"description": "The arguments for the server command in stdio mode."
747747
},
748+
"cwd": {
749+
"anyOf": [
750+
{
751+
"type": "string"
752+
},
753+
{
754+
"type": "null"
755+
}
756+
],
757+
"default": null,
758+
"title": "Cwd",
759+
"description": "The working directory to use when spawning the server process in stdio mode."
760+
},
748761
"url": {
749762
"anyOf": [
750763
{

src/mcp_agent/cli/commands/server.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,8 @@ def _persist_server_entry(name: str, settings: MCPServerSettings) -> None:
304304
entry["args"] = settings.args
305305
if settings.env:
306306
entry["env"] = settings.env
307+
if settings.cwd:
308+
entry["cwd"] = settings.cwd
307309
else:
308310
if settings.url:
309311
entry["url"] = settings.url
@@ -431,6 +433,9 @@ def add(
431433
env: Optional[str] = typer.Option(
432434
None, "--env", "-e", help="Environment variables (KEY=value,...)"
433435
),
436+
cwd: Optional[str] = typer.Option(
437+
None, "--cwd", help="Working directory for stdio server process"
438+
),
434439
write: bool = typer.Option(
435440
True, "--write/--no-write", help="Persist to config file"
436441
),
@@ -505,6 +510,7 @@ def add(
505510
entry.command = recipe.get("command")
506511
entry.args = recipe.get("args", [])
507512
entry.env = {**recipe.get("env", {}), **env_dict}
513+
entry.cwd = recipe.get("cwd")
508514

509515
srv_name = name or value
510516

@@ -619,6 +625,7 @@ def add(
619625
entry.command = parts[0]
620626
entry.args = parts[1:] if len(parts) > 1 else []
621627
entry.env = env_dict
628+
entry.cwd = cwd
622629
srv_name = name or parts[0].split("/")[-1]
623630

624631
# Check if server already exists
@@ -853,6 +860,7 @@ def import_claude(
853860
entry.command = server_config.get("command", "")
854861
entry.args = server_config.get("args", [])
855862
entry.env = server_config.get("env", {})
863+
entry.cwd = server_config.get("cwd")
856864
_persist_server_entry(name, entry)
857865
console.print(
858866
f"\n[green]✅ Imported {len(servers)} servers[/green]"

src/mcp_agent/cli/core/utils.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,5 +170,6 @@ def attach_stdio_servers(
170170
transport="stdio",
171171
command=desc.get("command"),
172172
args=desc.get("args", []),
173+
cwd=desc.get("cwd"),
173174
)
174175
app.context.config.mcp.servers[name] = settings

src/mcp_agent/cli/utils/importers.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ def _to_settings(obj: dict) -> MCPServerSettings:
2828
command=obj.get("command"),
2929
args=obj.get("args") or [],
3030
env=obj.get("env") or None,
31+
cwd=obj.get("cwd") or None,
3132
)
3233
else:
3334
return MCPServerSettings(

src/mcp_agent/config.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ class MCPServerSettings(BaseModel):
7878
args: List[str] = Field(default_factory=list)
7979
"""The arguments for the server command in stdio mode."""
8080

81+
cwd: str | None = None
82+
"""The working directory to use when spawning the server process in stdio mode."""
83+
8184
url: str | None = None
8285
"""The URL for the server for SSE, Streamble HTTP or websocket transport."""
8386

src/mcp_agent/mcp/mcp_connection_manager.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,7 @@ def transport_context_factory():
442442
command=config.command,
443443
args=config.args or [],
444444
env={**get_default_environment(), **(config.env or {})},
445+
cwd=config.cwd or None,
445446
)
446447
# Create stdio client config with redirected stderr
447448
return stdio_client(server=server_params)

src/mcp_agent/mcp/mcp_server_registry.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ async def start_server(
153153
command=config.command,
154154
args=config.args or [],
155155
env={**get_default_environment(), **(config.env or {})},
156+
cwd=config.cwd or None,
156157
)
157158

158159
async with stdio_client(server_params) as (read_stream, write_stream):

0 commit comments

Comments
 (0)