DevPilot MCP
Allows listing containers, viewing logs, and restarting or stopping Docker containers.
Provides Git operations such as status, branch, commit history, diff, push/pull, and stash management.
Supports cloning repositories, creating pull requests and issues, and listing branches.
Enables executing SQL queries, showing schema, describing tables, and listing databases.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@DevPilot MCPshow me modified files"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
DevPilot
DevPilot is an MCP-based local development agent. An LLM reasons over the user's request and available tools, calls MCP tools (git / docker / filesystem), observes the results, and loops until it can produce a final answer.
Quick start
Copy
.env.exampleto.envand setOPENAI_API_KEY(OpenRouter / Groq / OpenAI-compatible).From the repo root:
PYTHONPATH=client poetry run python client/client.pyType a prompt. Type
quitto exit.
Hiring-manager demo (broken backend container):
PYTHONPATH=client poetry run python demo/run_demo.pySee demo/README.md for the talking script and a no-Docker backup.
Optional env vars:
Variable | Default | Purpose |
| (required) | API key |
|
| Compatible API base URL |
|
| Model name |
Related MCP server: My Coding Buddy MCP Server
Architecture
User
│
▼
Conversation Manager
│
▼
Tool Registry (MCP)
│
list_tools() + inputSchema
│
▼
LLM (Planner)
│
┌───────────────┴────────────────┐
│ │
▼ ▼
Tool Call(s) Final Answer
│ │
▼ ▼
Executor Exit
│
▼
Tool Result(s)
│
▼
Conversation Manager
│
└───────────────► Back to LLMFile map
Stage | File | Role |
Entry |
| Starts MCP server over stdio, REPL, prints answers |
Loop |
| Orchestrates plan → execute → update history (max 8 turns) |
History |
| Stores user / assistant / tool messages |
Schemas |
| Formats MCP tool schemas for the LLM |
Planner |
| LLM returns |
Execute |
| Calls |
Format |
| Pretty-prints tool results into conversation |
Models |
|
|
MCP app |
|
|
Tools |
|
|
Impl |
| Real commands |
Helpers |
| Validate paths, run subprocess, |
Request flow (by file)
1. Boot — client/client.py
Loads
.envSpawns the MCP server:
poetry run python -m server.serverover stdioCreates an MCP
ClientSession, callsinitialize(), thenlist_tools()Starts a REPL and passes each prompt into
agent_main
2. Agent loop — client/agent/main.py
Builds:
ConversationManager— historyToolRegistry— tool schemasLLMPlanner— next decisionExecutor— MCP tool calls
Then:
conversation.add_user(prompt)Loop up to
MAX_TURNS = 8:planner.plan(conversation, registry)If
tool_call→ record calls →executor.execute→ record results → continueIf
final_answer/clarification/error→ return
3. Conversation — client/agent/conversation.py
Stores messages as user, assistant, or tool.to_prompt_text() is what the LLM sees every turn.
4. Tool registry — client/agent/registry.py
Turns MCP list_tools() into JSON schema text (name, description, properties, required).
5. LLM planner — client/agent/llm.py
Receives:
System prompt (DevPilot rules)
Available tool schemas
Conversation history
Returns a single JSON object parsed into AgentResponse.
6. Executor — client/agent/executor.py
For each ToolCall:
await session.call_tool(tool_name, tool_args)Collects text content into
ToolResult
The executor never decides — it only runs tools.
7. MCP server — server/server.py + implementations
@mcp.tool handlers delegate to modules under:
server/git/— status, branch, log, diff, commit, push, pull, stash, …server/doocker/— ps, logs, inspect, exec, start, stop, restart, …server/filesystem/— read/write/list/search/find/delete/symbols
Helpers:
validator— ensure path is a git repo / file / directoryCommands.run_cmd/run_shell_cmd— subprocess wrappersresponse.ok/fail— standard{success, result|message}dicts
8. Context — client/agent/context.py
Formats each ToolResult into readable text, then appends it to the conversation for the next LLM turn.
Example: git status + branch
User
What's the status of my repo at /Users/nitin/Desktop/local-git-mcp? Which branch am I on?Turn 1 — LLM (client/agent/llm.py)
{
"status": "tool_call",
"tool_calls": [
{
"tool_name": "git_status",
"tool_args": {
"repo_path": "/Users/nitin/Desktop/local-git-mcp"
}
},
{
"tool_name": "git_current_branch",
"tool_args": {
"repo_path": "/Users/nitin/Desktop/local-git-mcp"
}
}
]
}Executor → MCP → server
Tool | Path | Command |
|
|
|
|
|
|
Tool result shape
{"success": True, "result": "<command stdout>"}Results are formatted by context.py and stored in the conversation.
Turn 2 — LLM
{
"status": "final_answer",
"answer": "You're on branch main. The working tree has unstaged changes in client/agent/llm.py."
}client/client.py prints:
DevPilot> You're on branch main. The working tree has unstaged changes in client/agent/llm.py.Example: docker debugging
User
Why is my backend container failing?LLM → docker_ps()
backend -> exited, db -> running
LLM → docker_logs(container="backend")
panic: database connection refused
LLM → final_answer
The backend exits because it cannot connect to the database.LLM response types
Tool call
{
"status": "tool_call",
"tool_calls": [
{
"tool_name": "docker_logs",
"tool_args": { "container": "backend" }
}
]
}Final answer
{
"status": "final_answer",
"answer": "The backend container exits because it cannot connect to the database."
}Clarification
{
"status": "clarification",
"answer": "Which repository path should I inspect?"
}Error
{
"status": "error",
"error": "Unable to execute the requested tool."
}Agent loop (simplified)
conversation.add_user(prompt)
for _ in range(MAX_TURNS):
response = planner.plan(conversation, registry)
if response.status == TOOL_CALL:
results = await executor.execute(response.tool_calls)
conversation.add_tool_calls_and_results(...)
continue
return response # final_answer | clarification | errorDesign principles
LLM reasons; MCP tools execute — the executor never makes decisions.
Discoverable tools — schemas come from MCP
list_tools(), not hard-coded client logic.Conversation is stateful — multi-step flows (e.g.
docker_ps→docker_logs) work naturally.Structured LLM I/O — forced JSON statuses; the agent must not invent tool output.
Deterministic tools — validators + subprocess; standard
ok/failresponses.Bounded loop — stops after
MAX_TURNS(8) to avoid infinite tool calling.
Available tools (high level)
Git: status, current branch, branch list, log, diff, show, checkout, create branch, commit, push, pull, stash
Docker: ps, images, logs, inspect, exec, start, stop, restart
Filesystem: read/write file, list directory, search text, find files, file info, delete file, list/read symbols
This server cannot be deployed
Maintenance
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Git-backed platform for skills, tools, and context for AI agents
A Model Context Protocol server for Wix AI tools
- OolkinOAuthcom.oolkin
AI colleagues that keep your standards, your project and their reasoning between sessions
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA comprehensive Model Context Protocol server implementation that enables AI assistants to interact with file systems, databases, GitHub repositories, web resources, and system tools while maintaining security and control.74 npm2MIT
- FlicenseAqualityDmaintenanceA personal AI coding assistant that connects to various development environments and helps automate tasks, provide codebase insights, and improve coding decisions by leveraging the Model Context Protocol.10-
- FlicenseNot gradedqualityDmaintenanceEquips AI coding agents with filesystem, Git, database, and computation tools via the Model Context Protocol.1-
- FlicenseNot gradedqualityCmaintenanceSecure local development platform that exposes controlled developer capabilities (FS, Git, search, command execution) to AI assistants via MCP with deny-by-default security and audit logging.-