MCP workflow enforcement server -- guides Claude and other AI agents through structured, step-by-step tasks without skipping steps or cutting corners
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · streamable-http · http counts 0 tools · 0 res
· 0 prompts
permission surface via code analysis
No tools enumerated yet for this server.
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed v3.117.0 · analyzer v33 · 4w ago
skills & prompt files 4
- agent-rules EtienneBBeaulac-workrail-0298754/.cursor/rules/workrail-executor.mdc
- agent-rules EtienneBBeaulac-workrail-0298754/AGENTS.md
- agent-rules EtienneBBeaulac-workrail-0298754/CLAUDE.md
- agent-rules EtienneBBeaulac-workrail-0298754/console/CLAUDE.md
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 1124
filesystem 219
- fs (weak) EtienneBBeaulac-workrail-0298754/-issue-160/tests/integration/mcp-http-transport.test.ts :14
import * as fs from 'fs/promises'; - fs (weak) EtienneBBeaulac-workrail-0298754/-issue-160/tests/unit/mcp/v2-inspect-workflow-references.test.ts :7
import * as fs from 'fs/promises'; - fs (weak) EtienneBBeaulac-workrail-0298754/scripts/backfill-timestamps.ts :31
import * as fs from 'fs/promises'; - fs (weak) EtienneBBeaulac-workrail-0298754/scripts/backlog-priority.ts :14
import * as fs from 'fs'; - fs (weak) EtienneBBeaulac-workrail-0298754/scripts/benchmark-token-size.ts :14
import { writeFile } from 'fs/promises'; - fs (weak) EtienneBBeaulac-workrail-0298754/scripts/ci-policy-check.js :10
const fs = require('fs'); - fs (weak) EtienneBBeaulac-workrail-0298754/scripts/create-from-template.js :16
import { writeFile } from 'fs/promises'; - fs (weak) EtienneBBeaulac-workrail-0298754/scripts/dist-manifest.js :9
const fs = require('fs'); - fs (weak) EtienneBBeaulac-workrail-0298754/scripts/generate-authoring-docs.js :1
const fs = require('fs'); - fs (weak) EtienneBBeaulac-workrail-0298754/scripts/generate-golden-tokens.ts :9
import * as fs from 'fs'; - fs (weak) EtienneBBeaulac-workrail-0298754/scripts/generate-lock-coverage.ts :29
import * as fs from 'fs'; - fs (weak) EtienneBBeaulac-workrail-0298754/scripts/generate-workflow-docs.js :20
const fs = require('fs');
show 28 more
- fs (weak) EtienneBBeaulac-workrail-0298754/scripts/stamp-workflow.ts :17
import * as fs from 'fs'; - fs (weak) EtienneBBeaulac-workrail-0298754/scripts/validate-authoring-coverage.js :18
const fs = require('fs'); - fs (weak) EtienneBBeaulac-workrail-0298754/scripts/validate-authoring-spec.js :1
const fs = require('fs'); - fs (weak) EtienneBBeaulac-workrail-0298754/scripts/validate-dashboard.js :16
import { readFile } from 'fs/promises'; - fs (weak) EtienneBBeaulac-workrail-0298754/scripts/validate-feature-coverage.js :19
const fs = require('fs'); - fs (weak) EtienneBBeaulac-workrail-0298754/scripts/validate-workflow-discovery.js :12
const fs = require('fs'); - fs (weak) EtienneBBeaulac-workrail-0298754/scripts/validate-workflows-registry.ts :30
import * as fs from 'fs'; - fs EtienneBBeaulac-workrail-0298754/src/application/services/compiler/binding-registry.ts :25
import { readFileSync } from 'fs'; - fs EtienneBBeaulac-workrail-0298754/src/application/services/compiler/routine-loader.ts :15
import { readFileSync, readdirSync, existsSync } from 'fs'; - fs EtienneBBeaulac-workrail-0298754/src/application/use-cases/raw-workflow-file-scanner.ts :1
import fs from 'fs/promises'; - fs EtienneBBeaulac-workrail-0298754/src/application/validation.ts :1
import fs from 'fs'; - fs EtienneBBeaulac-workrail-0298754/src/cli-worktrain.ts :21
import fs from 'fs'; - fs EtienneBBeaulac-workrail-0298754/src/cli.ts :14
import fs from 'fs'; - fs EtienneBBeaulac-workrail-0298754/src/cli/commands/worktrain-report.ts :21
import * as fs from 'node:fs/promises'; - fs EtienneBBeaulac-workrail-0298754/src/cli/commands/worktrain-tell.ts :14
* Concurrency note: fs.appendFile is used for writes. POSIX guarantees atomicity - fs EtienneBBeaulac-workrail-0298754/src/config/config-file.ts :18
import * as fs from 'fs'; - fs EtienneBBeaulac-workrail-0298754/src/console/standalone-console.ts :28
import * as fs from 'node:fs/promises'; - fs EtienneBBeaulac-workrail-0298754/src/context-assembly/infra.ts :1
import * as fs from 'node:fs/promises'; - fs EtienneBBeaulac-workrail-0298754/src/daemon/cortex/session-cortex.ts :1
import * as fs from 'node:fs/promises'; - fs EtienneBBeaulac-workrail-0298754/src/daemon/daemon-env.ts :18
import fs from 'fs'; - fs EtienneBBeaulac-workrail-0298754/src/daemon/daemon-events.ts :23
import * as fs from 'node:fs/promises'; - fs EtienneBBeaulac-workrail-0298754/src/daemon/gate-resume.ts :23
import * as fs from 'node:fs/promises'; - fs EtienneBBeaulac-workrail-0298754/src/daemon/io/conversation-log.ts :15
import * as fs from 'node:fs/promises'; - fs EtienneBBeaulac-workrail-0298754/src/daemon/io/execution-stats.ts :13
import * as fs from 'node:fs/promises'; - fs EtienneBBeaulac-workrail-0298754/src/daemon/io/soul-loader.ts :13
import * as fs from 'node:fs/promises'; - fs EtienneBBeaulac-workrail-0298754/src/daemon/io/workspace-context-loader.ts :13
import * as fs from 'node:fs/promises'; - fs EtienneBBeaulac-workrail-0298754/src/daemon/runner/finalize-session.ts :13
import * as fs from 'node:fs/promises'; - fs EtienneBBeaulac-workrail-0298754/src/daemon/runner/pre-agent-session.ts :10
import * as fs from 'node:fs/promises';
179 more not shown — this panel samples each group; the count above is the real total.
shell / exec 38
- shell (weak) EtienneBBeaulac-workrail-0298754/scripts/codemods/mods/test-platform-guard.ts :93
// Identifier form: exec(...), execSync(...), execAsync(...) - shell (weak) EtienneBBeaulac-workrail-0298754/scripts/validate-authoring-spec.js :3
const { execSync } = require('child_process'); - shell EtienneBBeaulac-workrail-0298754/src/cli-worktrain.ts :24
import { execFile } from 'child_process'; - shell EtienneBBeaulac-workrail-0298754/src/cli/commands/worktrain-daemon-install.ts :76
* The callee MUST use execFile (not exec) to avoid shell injection. - shell EtienneBBeaulac-workrail-0298754/src/cli/commands/worktrain-daemon.ts :25
* - All I/O is injected via WorktrainDaemonCommandDeps. No direct fs/child_process. - shell EtienneBBeaulac-workrail-0298754/src/context-assembly/infra.ts :4
import { execFile } from 'node:child_process'; - shell EtienneBBeaulac-workrail-0298754/src/coordinators/pr-review.ts :928
// Drain before any spawn (never mid-agent-run). Acts on stop/skip-pr/add-pr - shell EtienneBBeaulac-workrail-0298754/src/daemon/runner/pre-agent-session.ts :12
import { execFile } from 'node:child_process'; - shell EtienneBBeaulac-workrail-0298754/src/daemon/startup-recovery.ts :19
import { execFile } from 'node:child_process'; - shell EtienneBBeaulac-workrail-0298754/src/daemon/tools/bash.ts :7
import { exec } from 'node:child_process'; - shell EtienneBBeaulac-workrail-0298754/src/daemon/tools/glob-grep.ts :9
import { execFile } from 'node:child_process'; - shell EtienneBBeaulac-workrail-0298754/src/daemon/tools/spawn-agent.ts :29
* Used in both single-spawn (top-level) and parallel (agents array element) forms.
show 26 more
- shell EtienneBBeaulac-workrail-0298754/src/daemon/workflow-enricher.ts :1
import { execFile } from 'node:child_process'; - shell EtienneBBeaulac-workrail-0298754/src/daemon/workflow-runner.ts :28
import { execFile } from 'node:child_process'; - shell EtienneBBeaulac-workrail-0298754/src/infrastructure/session/SessionManager.ts :5
import { execSync } from 'child_process'; - shell EtienneBBeaulac-workrail-0298754/src/infrastructure/storage/git-workflow-storage.ts :11
import { exec, execFile } from 'child_process'; - shell EtienneBBeaulac-workrail-0298754/src/mcp/git-metrics/reader.ts :5
* - All functions use execFile (not exec) -- repoRoot is user-controlled input. - shell EtienneBBeaulac-workrail-0298754/src/mcp/handlers/session.ts :12
import { spawn } from 'child_process'; - shell EtienneBBeaulac-workrail-0298754/src/trigger/delivery-action.ts :8
* - Scripts over agent (backlog.md): all delivery runs as child_process.execFile calls. - shell EtienneBBeaulac-workrail-0298754/src/trigger/notification-service.ts :26
import * as childProcess from 'node:child_process'; - shell EtienneBBeaulac-workrail-0298754/src/trigger/trigger-listener.ts :24
import { execFile } from 'node:child_process'; - shell EtienneBBeaulac-workrail-0298754/src/trigger/trigger-router.ts :26
import { execFile } from 'node:child_process'; - shell EtienneBBeaulac-workrail-0298754/src/utils/workspace-path-utils.ts :3
import { execFile } from 'child_process'; - shell EtienneBBeaulac-workrail-0298754/src/v2/infra/local/git-snapshot/index.ts :1
import { execFile } from 'node:child_process'; - shell EtienneBBeaulac-workrail-0298754/src/v2/infra/local/workspace-anchor/index.ts :8
import { exec } from 'child_process'; - shell EtienneBBeaulac-workrail-0298754/src/v2/usecases/console-routes.ts :16
import { execFile } from 'child_process'; - shell EtienneBBeaulac-workrail-0298754/src/v2/usecases/worktree-service.ts :22
import { execFile } from 'child_process'; - shell (weak) EtienneBBeaulac-workrail-0298754/tests/architecture/v2-workflow-schema-compatibility.test.ts :3
import { execFileSync } from 'node:child_process'; - shell (weak) EtienneBBeaulac-workrail-0298754/tests/helpers/git-test-utils.ts :7
import { execFile, execFileSync } from 'child_process'; - shell (weak) EtienneBBeaulac-workrail-0298754/tests/unit/cli-validate.test.js :4
var child_process_1 = require("child_process"); - shell (weak) EtienneBBeaulac-workrail-0298754/tests/unit/cli-validate.test.ts :2
import { execSync } from 'child_process'; - shell (weak) EtienneBBeaulac-workrail-0298754/tests/unit/cli-version.test.ts :41
const { execSync } = require('child_process'); - shell (weak) EtienneBBeaulac-workrail-0298754/tests/unit/coordinator-pr-review.test.ts :689
// Find the fix agent spawn (wr.coding-task) - shell (weak) EtienneBBeaulac-workrail-0298754/tests/unit/git-metrics-reader.test.ts :14
// Mock child_process.execFile - shell (weak) EtienneBBeaulac-workrail-0298754/tests/unit/open-dashboard.test.ts :8
import { spawn } from 'child_process'; - shell (weak) EtienneBBeaulac-workrail-0298754/tests/unit/validate-workflow-registry.test.ts :694
const { execSync } = await import('child_process'); - shell (weak) EtienneBBeaulac-workrail-0298754/tests/unit/workflow-runner-file-tools.test.ts :19
import { execFileSync } from 'node:child_process'; - shell (weak) EtienneBBeaulac-workrail-0298754/tests/unit/workflow-runner-spawn-agent.test.ts :500
describe('makeSpawnAgentTool() parallel spawn (agents[])', () => {
network 31
- net (weak) EtienneBBeaulac-workrail-0298754/-issue-160/tests/integration/mcp-http-transport.test.ts :11
import fetch from 'node-fetch'; - net EtienneBBeaulac-workrail-0298754/console/src/api/hooks.ts :17
const res = await fetch(url); - net EtienneBBeaulac-workrail-0298754/console/src/hooks/useSessionDetailRepository.ts :20
/** Session detail data. Undefined only during the initial fetch (no cached data). */ - net EtienneBBeaulac-workrail-0298754/console/src/hooks/useSessionListRepository.ts :30
* Session list data. Undefined only during the initial fetch (no cached data). - net EtienneBBeaulac-workrail-0298754/console/src/hooks/useWorkflowsRepository.ts :20
* Undefined only during the initial fetch (no cached data). - net EtienneBBeaulac-workrail-0298754/console/src/hooks/useWorkspaceRepository.ts :26
/** Session list data. Undefined only during the initial fetch (no cached data). */ - net EtienneBBeaulac-workrail-0298754/src/cli-worktrain.ts :153
const response = await globalThis.fetch(url, { - net EtienneBBeaulac-workrail-0298754/src/cli/commands/worktrain-await.ts :226
const response = await deps.fetch(url); - net EtienneBBeaulac-workrail-0298754/src/cli/commands/worktrain-dispatch.ts :235
const response = await deps.fetch(url, { - net EtienneBBeaulac-workrail-0298754/src/cli/commands/worktrain-spawn.ts :172
const response = await deps.fetch(url, { - net EtienneBBeaulac-workrail-0298754/src/console/standalone-console.ts :27
import * as http from 'node:http'; - net EtienneBBeaulac-workrail-0298754/src/infrastructure/storage/remote-workflow-storage.ts :183
const response = await fetch(url, {
show 19 more
- net EtienneBBeaulac-workrail-0298754/src/mcp/handlers/session.ts :13
import { request } from 'http'; - net EtienneBBeaulac-workrail-0298754/src/mcp/transports/http-listener.ts :16
import { createServer, type Server as HttpServerType } from 'http'; - net EtienneBBeaulac-workrail-0298754/src/trigger/adapters/github-poller.ts :118
* Default: globalThis.fetch (Node 18+). - net EtienneBBeaulac-workrail-0298754/src/trigger/adapters/github-queue-poller.ts :78
* Default: globalThis.fetch (Node 18+). - net EtienneBBeaulac-workrail-0298754/src/trigger/adapters/gitlab-poller.ts :58
* Default: globalThis.fetch (Node 18+). - net EtienneBBeaulac-workrail-0298754/src/trigger/delivery-client.ts :7
* - post() uses the global fetch() (available since Node 18; this project - net EtienneBBeaulac-workrail-0298754/src/trigger/notification-service.ts :229
this._fetchFn = config.fetchFn ?? ((url, init) => globalThis.fetch(url, init)); - net EtienneBBeaulac-workrail-0298754/src/trigger/review-approval-adapter.ts :400
return fetch(url, init as RequestInit) as Promise<{ ok: boolean; status: number; json(): Promise<unknown> }>; - net EtienneBBeaulac-workrail-0298754/src/trigger/trigger-listener.ts :23
import * as http from 'node:http'; - net (weak) EtienneBBeaulac-workrail-0298754/tests/integration/mcp-http-transport.test.ts :11
import fetch from 'node-fetch'; - net (weak) EtienneBBeaulac-workrail-0298754/tests/unit/cli-worktrain-console.test.ts :17
import * as http from 'node:http'; - net (weak) EtienneBBeaulac-workrail-0298754/tests/unit/mcp/http-listener.test.ts :2
import * as net from 'net'; - net (weak) EtienneBBeaulac-workrail-0298754/tests/unit/open-dashboard.test.ts :11
import { request } from 'http'; - net (weak) EtienneBBeaulac-workrail-0298754/tests/unit/standalone-console.test.ts :13
import * as http from 'node:http'; - net (weak) EtienneBBeaulac-workrail-0298754/tests/unit/trigger-router.test.ts :855
const res = await fetch(`http://localhost:${port}/health`); - net (weak) EtienneBBeaulac-workrail-0298754/tests/unit/v2/console-routes-perf.test.ts :9
import http from 'http'; - net EtienneBBeaulac-workrail-0298754/web/assets/scaffolds/dashboard.js :1195
const response = await fetch(dataSource); - net EtienneBBeaulac-workrail-0298754/web/workflows/bug-investigation/dashboard-v2.js :91
const response = await fetch(`${API_BASE}/api/sessions/${workflowId}/${sessionId}`); - net EtienneBBeaulac-workrail-0298754/web/workflows/bug-investigation/dashboard.js :32
const response = await fetch(`${API_BASE}/api/sessions/${workflowId}/${sessionId}`);
secrets 11
- secrets EtienneBBeaulac-workrail-0298754/.releaserc.cjs :7
repositoryUrl: `https://x-access-token:${process.env.GITHUB_TOKEN}@github.com/EtienneBBeaulac/workrail.git`, - secrets EtienneBBeaulac-workrail-0298754/src/cli-worktrain.ts :385
const apiKey = process.env['ANTHROPIC_API_KEY']; - secrets EtienneBBeaulac-workrail-0298754/src/cli.ts :246
const apiKey = process.env['ANTHROPIC_API_KEY']; - secrets EtienneBBeaulac-workrail-0298754/src/infrastructure/storage/enhanced-multi-source-workflow-storage.ts :610
apiKey: process.env['WORKFLOW_REGISTRY_API_KEY'], - secrets EtienneBBeaulac-workrail-0298754/src/trigger/index.ts :11
* apiKey: process.env.ANTHROPIC_API_KEY, - secrets EtienneBBeaulac-workrail-0298754/src/trigger/trigger-store.ts :615
// Example: "$MY_HMAC_SECRET" resolves to process.env.MY_HMAC_SECRET. - secrets EtienneBBeaulac-workrail-0298754/src/v2/usecases/console-routes.ts :892
const apiKey = process.env['ANTHROPIC_API_KEY']; - secrets (weak) EtienneBBeaulac-workrail-0298754/tests/integration/structured-output-tools-coexist.test.ts :95
const hasDirectCredentials = !!process.env['ANTHROPIC_API_KEY']; - secrets (weak) EtienneBBeaulac-workrail-0298754/tests/unit/enhanced-multi-source-workflow-storage.test.ts :503
authToken: process.env['GITHUB_TOKEN'], - secrets (weak) EtienneBBeaulac-workrail-0298754/tests/unit/external-workflow-auth.test.ts :27
process.env['GITHUB_TOKEN'] = 'ghp_test123'; - secrets (weak) EtienneBBeaulac-workrail-0298754/tests/unit/worktrain-daemon.test.ts :687
delete process.env['WORKTRAIN_BOT_TOKEN'];
install hooks 3
- prepack (suspicious) EtienneBBeaulac-workrail-0298754/package.json :34
node -e "require('fs').chmodSync('dist/mcp-server.js',0o755); require('fs').chmodSync('dist/cli-worktrain.js',0o755); require('fs').chmodSync('dist/cli-workrail.js',0o755);" - preinstall (suspicious) EtienneBBeaulac-workrail-0298754/package.json :55
node -e "const v=parseInt(process.versions.node.split('.')[0],10); if(v<20){console.error('WorkRail requires Node.js >=20. Current: '+process.versions.node+'\nPlease upgrade: https://nodejs.org/'); pr - prepare EtienneBBeaulac-workrail-0298754/package.json :92
bash scripts/setup-hooks.sh
declared dependencies 44
- @modelcontextprotocol/sdk@^1.24.0
- @anthropic-ai/bedrock-sdk@^0.32.0
- @anthropic-ai/sdk@^0.115.0
- @scure/base@2.2.0
- ajv@^8.17.1
- chalk@^5.3.0
- commander@^14.0.0
- cors@^2.8.5
- dotenv@^17.2.0
- express@^5.1.0
- neverthrow@^8.2.0
- open@^11.0.0
show 28 more
- reflect-metadata@^0.2.0
- semver@^7.7.2
- tinyglobby@^0.2.15
- tsconfig-paths@^4.2.0
- tslib@^2.8.1
- tsyringe@^4.8.0
- zod@^3.22.4
- @duckdb/node-api@^1.5.2-r.1
- @playwright/test@^1.55.1
- @semantic-release/changelog@^6.0.3
- @semantic-release/exec@^7.1.0
- @semantic-release/git@^10.0.1
- @semantic-release/github@^12.0.2
- @testing-library/react@^16.3.2
- @testing-library/user-event@^14.6.1
- @types/cors@^2.8.19
- @types/express@^5.0.3
- @types/node@^20.19.9
- @types/semver@^7.7.0
- @vitest/ui@^3.2.4
- conventional-changelog-conventionalcommits@^9.1.0
- fast-check@^4.6.0
- happy-dom@^20.0.11
- jsdom@^29.0.2
- lit@^3.3.1
- node-fetch@^3.3.2
- nodemon@^3.0.0
- semantic-release@^25.0.3
4 more not shown — this panel samples each group; the count above is the real total.
cursor-plugin 1
- opaque (low) EtienneBBeaulac-workrail-0298754/.cursor/rules/workrail-executor.mdc
bundled .cursor/ plugin descriptor (EtienneBBeaulac-workrail-0298754/.cursor/rules/workrail-executor.mdc) — presence-detected; review the descriptor