An MCP (Model Context Protocol) server that helps enforce development discipline and workflow best practices. This server acts as your coding conscience, reminding you to follow proper development workflows.
This MCP server guides you through a disciplined development workflow:
- Start Conscious - Be clear about what you're coding
- Fix/Implement - Write your code
- Create Tests - Always test your changes
- Run Tests - Tests must pass (GREEN)
- Document - Update documentation
- Commit & Push - Let the server stage, commit, and push your changes once verification passes (if you make new edits afterward, the workflow moves back to this step automatically)
- Release - After the push succeeds, record the release details before closing out the task
Each project gets its own isolated workflow state file.
npm install @programinglive/dev-workflow-mcp-serverThis will automatically create a .state/workflow-state.json file in the project where you ran npm install (using npm's INIT_CWD), keeping workflow history separate per project. If you're installing the package itself (inside node_modules), the script skips creation so it never pollutes the shared package directory.
git clone https://github.com/programinglive/dev-workflow-mcp-server.git
cd dev-workflow-mcp-server
npm installWindows prerequisites: Installing dependencies from source compiles native modules such as
better-sqlite3. Make sure Python 3 (added to PATH) and the Visual Studio Build Tools βDesktop development with C++β workload are installed before runningnpm install. Without them, npm will fail with a βneed pythonβ or build error.
Plesk supports Node.js applications through its Node.js extension. To deploy the MCP server on a Plesk subscription:
- Enable Node.js support β Ensure the Plesk administrator has installed the Node.js extension and enabled SSH access for your subscription.
- Upload the project β Either clone the repository or upload an archive into the directory you will run it from (e.g.,
httpdocs/dev-workflow-mcp-server). From SSH you can run:cd httpdocs git clone https://github.com/programinglive/dev-workflow-mcp-server.git cd dev-workflow-mcp-server
- Install dependencies β In Pleskβs Node.js panel use βNPM installβ (or run
npm install --productionover SSH). Linux hosts already ship the Python/build toolchain required forbetter-sqlite3; if your plan uses a Windows host, install Python 3 and the Visual Studio Build Tools beforehand or ask your provider to enable them. - Define environment variables β In the Node.js panel add any environment variables you need (for example
DEV_WORKFLOW_USER_IDorDEV_WORKFLOW_STATE_FILE). This keeps state files outside the web root if desired. - Configure the application β Set Application startup file to
index.jsand Application mode toproduction. Plesk will run the server withnode index.js. - Start/Restart the app β Click βRestart Appβ so Plesk launches the MCP server with the new configuration. When you update the code, rerun βNPM installβ and restart.
Tip: The MCP server communicates over stdio. If you only need it as a CLI tool, you can also run
npx @programinglive/dev-workflow-mcp-serverdirectly in an SSH session without keeping it running under the Node.js panel.
- Local (source): Point your MCP client to
index.js. This runs directly from source and requires no build step. Recommended for MCP usage. - Production (built): Run
npm run buildonce to generatedist/. This creates an optimized bundle but isnβt needed for MCP usage.
Point your MCP client to the server entry point. Replace <PROJECT_ROOT> with the absolute path to this repository on your machine.
- Windsurf (
~/Library/Application Support/Windsurf/config.json):
{
"mcpServers": {
"dev-workflow": {
"command": "node",
"args": ["<PROJECT_ROOT>/index.js"]
}
}
}- Claude Desktop (
~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"dev-workflow": {
"command": "node",
"args": ["<PROJECT_ROOT>/index.js"]
}
}
}- Windsurf (
%APPDATA%\Windsurf\config.json):
{
"mcpServers": {
"dev-workflow": {
"command": "node",
"args": ["<PROJECT_ROOT>\\index.js"]
}
}
}- Claude Desktop (
%APPDATA%\Claude\claude_desktop_config.json):
{
"mcpServers": {
"dev-workflow": {
"command": "node",
"args": ["<PROJECT_ROOT>\\index.js"]
}
}
}- Windsurf (
~/.config/windsurf/config.json):
{
"mcpServers": {
"dev-workflow": {
"command": "node",
"args": ["<PROJECT_ROOT>/index.js"]
}
}
}- Claude Desktop (
~/.config/claude/claude_desktop_config.json):
{
"mcpServers": {
"dev-workflow": {
"command": "node",
"args": ["<PROJECT_ROOT>/index.js"]
}
}
}Note: On Windows paths in JSON require escaped backslashes (e.g.,
"C:\\path\\to\\project").
After adding the configuration, restart the application to load the MCP server.
This project includes a Vite-based build system for creating optimized distributions.
npm run build- Bundle the source intodist/index.mjsfor distributionnpm run dev- Run in development mode with file watchingnpm run local- Alias for running from source (same asnpm start)npm run web- Launch the lightweight workflow dashboard for browsing task history (see Web Dashboard docs)
This command starts the dashboard defined in web/server.js, giving you a quick view of workflow history and summary statistics.
npm run web
# π Dev Workflow Dashboard running at http://localhost:3111- Default port: 3111 (or the next free port if occupied). Override with
DEV_WORKFLOW_WEB_PORT. - Query parameter:
?user=<id>lets you inspect another userβs history (defaults todefault). - API endpoints:
GET /api/summary?user=<id>β overall stats for the user.GET /api/history?user=<id>&page=1&pageSize=20&startDate=YYYY-MM-DD&endDate=YYYY-MM-DDβ paginated task history.GET /api/history-summary?user=<id>&frequency=daily|monthly|yearlyβ aggregated counts over time.
Open http://localhost:3111 in a browser to view the dashboard UI (web/index.html).
Running npm run build generates:
dist/index.mjs- Optimized ES module bundle- Source maps and other build artifacts
The build bundles all source files while externalizing Node.js built-in modules and dependencies, resulting in a single file distribution.
For MCP server usage, point your client at index.js (source) to avoid stdio transport compatibility issues. The built dist/index.mjs is primarily for:
- npm package distribution
- Performance optimization
- Embedding in other projects
When you install this package in a project, a .state/workflow-state.json file is automatically created in your project root. This file:
- Stores workflow history specific to that project
- Tracks task progress independently per project
- Should be gitignored (already in
.gitignoreby default) - Persists across sessions so your workflow state is preserved
- Stays centralized even if you run the server from nested build outputs like
dist/. The MCP server walks back to the project root (looking for.gitorpackage.json) before reading or writing workflow state, so you never need duplicate copies under build directories.
Each project maintains its own isolated workflow history, so you can work on multiple projects without mixing their histories. Within that .state directory, the MCP server automatically creates a unique per-user subdirectory (e.g., .state/users/user-abc123/). The generated identifier persists locally so multiple developers sharing the same repository never clobber each otherβs workflow files. If you prefer a specific name, set DEV_WORKFLOW_USER_ID before launching the server and that value will be used instead of the auto-generated ID.
If you're using this package, add this to your project's .gitignore:
.state/
This keeps workflow state local to each developer's machine.
Need to override the location? Set
DEV_WORKFLOW_STATE_FILE=/absolute/path/to/your/project/.state/workflow-state.jsonbefore launching the server (or inside your MCP client config). The server will honor that path, letting you keep the package installed centrally while maintaining per-project workflow history.
start_task- Begin a new coding taskmark_bug_fixed- Mark the feature/bug as fixed (requires tests next)create_tests- Mark that tests have been createdskip_tests- Skip tests with justificationrun_tests- Record test results (must pass to proceed)create_documentation- Mark documentation as createdcheck_ready_to_commit- Verify all steps are completecommit_and_push- Commit and push changesperform_release- Record release detailscomplete_task- Mark task as complete and resetforce_complete_task- Force completion with reasondrop_task- Abandon current taskget_workflow_status- Show current statusview_history- View completed taskscontinue_workflow- Get next-step guidancererun_workflow- Reset and restart the current task from the beginningrun_full_workflow- Execute every workflow step in sequence with a single command (requires supplying the details for each phase)
Use this when you already have all the information needed for each workflow phase and want to execute them in one go.
{
"summary": "Add payment webhooks",
"testCommand": "npm test",
"documentationType": "README",
"documentationSummary": "Document webhook configuration",
"commitMessage": "feat: add payment webhooks",
"releaseCommand": "npm run release:minor",
"releaseNotes": "Release webhook support",
"branch": "feature/payments",
"testsPassed": true,
"testDetails": "node --test; 42 tests",
"releaseType": "minor",
"preset": "minor"
}The tool will:
mark_bug_fixedusingsummarycreate_testsrun_testswithtestsPassed,testCommand, and optionaltestDetailscreate_documentationwithdocumentationTypeanddocumentationSummarycheck_ready_to_commitcommit_and_pushwithcommitMessageand optionalbranchperform_releasewithreleaseCommand, plus optionalreleaseNotes,releaseType, andpresetcomplete_taskreusingcommitMessage
All arguments except the optional flags are required and must be non-empty strings.
The package ships with a release guard (release-wrapper.js) that backs the npm run release:* scripts. The guard refuses to run unless:
- The current workflow phase is release
check_ready_to_commitandcommit_and_pushhave been completed- A release has not already been recorded for the active task
If any requirements are missing, the guard exits with guidance to return to the MCP tools. This prevents accidentally bumping versions or tagging releases outside the managed workflow. To release correctly:
- Use
perform_release {"command":"patch"}(orminor/major) via the MCP client. - The guard runs automatically, verifies the workflow state, and records the release before letting you finish with
complete_task.
This repository ships with .github/workflows/npm-publish.yml, which publishes the package to npm whenever a git tag matching v* is pushed (for example, v1.1.14). To enable the workflow:
- Create an npm automation token with publish rights (
npm token create --read-only false). - In the repository settings, add a secret named
NPM_TOKENcontaining that token. - Ensure your release process pushes tags after running
npm run release:<type>so the workflow triggers. - Confirm
npm run buildsucceeds locally; the workflow runs the build before publishing so broken bundles block the release. - GitHub provenance is enabled via
npm publish --provenance. Leave GitHub Actions' default OIDC permissions enabled so the job can request an ID token. - Keep the
repository.urlfield inpackage.jsonpointing at this GitHub repo. Provenance validation fails if it does not match the repository that built the package.
The workflow verifies that the tag version matches package.json before publishing and fails fast if they diverge.
All tool invocations validate their arguments payload before running:
- Strings are parsed as JSON and must resolve to an object (key/value pairs).
- Passing non-object data (numbers, arrays, plain text) triggers a guidance error.
- Missing or malformed arguments safely default to empty input so the tool can respond with actionable reminders.
Example (stringified JSON object):
{
"name": "start_task",
"arguments": "{\"description\":\"Add reporting endpoint\",\"type\":\"feature\"}"
}
Start a new coding task. This is your first step - be conscious about what you're coding.
Parameters:
description(string, required): Clear description of what you're going to codetype(enum, required): Type of task - "feature", "bugfix", "refactor", or "other"
Example:
Use the start_task tool with:
- description: "Add user authentication to the login page"
- type: "feature"
Mark that the bug/feature is fixed. Reminder: Now you MUST create tests!
Parameters:
summary(string, required): Brief summary of what was fixed/implemented
Confirm that you've created the necessary tests covering your change. Required before recording test results.
Parameters: none
Record an explicit justification when automated tests aren't feasible. Marks testing as satisfied so you can proceed with documentation and verification, while flagging the task for manual QA.
Parameters:
reason(string, required): Why automated tests were skipped
Record test results. NEVER commit if tests fail! Only proceed if all tests are green.
Parameters:
passed(boolean, required): Did all tests pass?testCommand(string, required): The test command that was rundetails(string, optional): Test results details
Example:
Use run_tests with:
- passed: true
- testCommand: "npm test"
- details: "All 15 tests passed"
Mark that documentation has been created/updated. This is required before committing.
Parameters:
documentationType(enum, required): "README", "inline-comments", "API-docs", "changelog", or "other"summary(string, required): What was documented
Check if all workflow steps are completed and you're ready to commit & push.
Automatically run git add, git commit, and git push after the ready check passes.
Auto-detection of primary branch: If no branch is specified, the tool automatically detects your project's primary branch by checking for origin/main first, then falling back to origin/master. This eliminates the need to specify the branch parameter for most projects.
Parameters:
commitMessage(string, required): Conventional commit message to usebranch(string, optional): Target branch to push. If omitted, auto-detects primary branch (main or master)
Record the release after you've committed and pushed. Required before you can complete the task.
Parameters:
command(string, required): Release command that was executed (e.g.,npm run release)notes(string, optional): Additional release notes
Mark the task as complete after successful commit & push. Resets workflow for next task.
Parameters:
commitMessage(string, required): The commit message used
Abandon the current task without completing the workflow. Preserves an audit entry with context, then resets the state so you can start fresh.
Parameters:
reason(string, optional): Additional detail about why the task was dropped
Get current workflow status and what needs to be done next.
View workflow history of completed tasks.
Parameters:
limit(number, optional): Number of recent tasks to show (default: 10)
Get a complete reminder of the development workflow discipline.
Get a pre-commit checklist to ensure nothing is missed before committing.
Here's how you'd use this MCP server in a typical coding session:
-
Start your task:
Ask Cascade to use start_task: "Start a new task: implementing user profile page, type: feature" -
Code your feature/fix
- Write your code as usual
-
Mark as fixed:
"Mark the feature as fixed: User profile page with avatar and bio completed" -
Create tests:
- Write your tests
- The server will remind you this is mandatory!
-
Run tests:
"Record test results: passed=true, command='npm test'"- If tests fail, the server will block you from proceeding!
-
Document:
"Create documentation: type=README, summary='Added user profile section to docs'" -
Check readiness:
"Check if I'm ready to commit" -
Commit & Push:
"Commit and push: commitMessage='feat: add user profile page with tests and docs'" -
Record release:
"Record release: command='npm run release', notes='v1.2.3'"
- Complete:
"Complete the task with commit message: 'feat: add user profile page'"
- Drop task (optional):
"Drop task: reason='Switching to a different feature'"
- Enforces discipline: Won't let you skip steps
- Test-driven: Blocks commits if tests fail
- Documentation reminder: Ensures you document your work
- State tracking: Remembers where you are in the workflow
- History: Keeps track of completed tasks
- Prompts: Quick reminders of best practices
- β Committing without tests
- β Committing with failing tests
- β Committing without documentation
- β Losing track of what you're working on
- β Skipping important workflow steps
- Always start with
start_task- This sets your intention - Never skip tests without justification - Use
skip_testsonly when absolutely necessary and document the reason for manual QA - Use
get_workflow_status- Check where you are anytime - Review history - Learn from your past tasks
- Follow the prompts - They contain best practices
You can modify the workflow in index.js:
- Add more workflow phases
- Customize reminders
- Add integration with your test runner
- Add custom validation rules
The server maintains state in .state/workflow-state.json:
- Current phase
- Task description
- Completion status of each step
- History of completed tasks
This file is automatically created and managed by the server. It contains local, machine-specific progress and is ignored by git so each environment can manage its own workflow history without cross-contamination.
This MCP server aligns with your existing development rules:
- β Enforces test-first discipline
- β Prevents commits with failing tests
- β Reminds about documentation
- β Tracks workflow state
- β Maintains history
MIT
Feel free to customize this server to match your specific workflow needs!