NeuroDock task fractionator MCP server — goal decomposition and next-action selection.
Project description
neurodock-mcp-task-fractionator
Local-first goal decomposition and single next-action selection, exposed as an MCP server.
- Version: v0.0.1 (developer preview)
- Status: Phase 1 substrate server.
- License: AGPL-3.0-or-later.
- Design: see
docs/decisions/0003-task-fractionator-tool-design.md. - Schemas (the contract):
schemas/decompose.schema.jsonandschemas/next_one.schema.json. - User stories driving this server: ("Director with ADHD" — voice-dump a vague initiative, get 5–12 atomic tasks plus the single next one).
Tools
decompose(goal, time_budget?)
Local-heuristic decomposition into atomic 5–90 minute tasks. Every task
carries at least one acceptance criterion, a dependency-sorted sequence
number, and a small bag of tags. Stateless: the server returns the list
and does not persist it. Persistence is the caller's job via
mcp-cognitive-graph.
goal— 5..500 character plain-language goal. Never logged.time_budget— optional ISO 8601 duration (PT4H,P3D,PT2H30M). Unparseable input returnsTIME_BUDGET_UNPARSEABLE.P3Dis treated as 3 working blocks of 4 hours, not 72 hours, per ADR 0003 §3.
Errors: GOAL_REQUIRED, GOAL_TOO_LONG, TIME_BUDGET_UNPARSEABLE,
BUDGET_INFEASIBLE, DEPENDENCY_CYCLE, ACCEPTANCE_CRITERIA_REQUIRED,
DECOMPOSITION_UNAVAILABLE.
next_one(project)
Returns exactly one task — the single thing the user should do next —
with a short reasoning paragraph and a confidence score in [0, 1].
project— 1..120 char project name (case-sensitive, no fuzzy match).- Pending tasks are read from a pluggable
PendingTaskSource. - Selection: lowest
sequencewhosedependenciesare all already complete in the pending set.
Errors: PROJECT_REQUIRED, NO_TASKS_AVAILABLE, ALL_TASKS_BLOCKED,
COGNITIVE_GRAPH_UNAVAILABLE.
Quick start
# From the repo root
uv sync
uv run pytest packages/mcp-task-fractionator/tests/ -v
# Run the server over stdio (the MCP transport):
uv run neurodock-mcp-task-fractionator
In-memory-only next_one (v0.0.1 caveat)
next_one reads pending tasks from a PendingTaskSource. v0.0.1 ships two
implementations:
-
InMemoryPendingTaskSource— default, used by tests. Holds tasks in process memory. Build the server explicitly with this source and seed it before callingnext_one:from neurodock_mcp_task_fractionator import ( InMemoryPendingTaskSource, build_server, ) source = InMemoryPendingTaskSource() source.add("founding-scope-rfc", [task_1, task_2, task_3]) server = build_server(source=source)
-
CognitiveGraphPendingTaskSource— Phase 2 stub. Always raisesCOGNITIVE_GRAPH_UNAVAILABLE. Real wiring lands once themcp-cognitive-graphPython client ships.
Selection via env var: NEURODOCK_TASK_SOURCE=memory|graph (default
memory). Unknown values fall back to memory rather than crashing.
Privacy
Per ADR 0003 §7 the goal text and project name are treated as sensitive user data:
- No remote calls. No LLM call inside the server.
- Goal text is never logged at any level.
- Validation errors reference field names, not user content.
- The rationale paragraph is built from recognised vocabulary tokens only; it never embeds the user's original goal text verbatim.
A test (test_decompose.py::test_rationale_does_not_contain_goal_text)
encodes the privacy invariant.
Development gates
# Lint + format check
uv run ruff check packages/mcp-task-fractionator/
uv run ruff format --check packages/mcp-task-fractionator/
# Strict type check
uv run mypy --strict packages/mcp-task-fractionator/src/
# Tests
uv run pytest packages/mcp-task-fractionator/tests/ -v
All four must pass before a PR is mergeable.
Pointers
- Architecture rationale:
docs/decisions/0003-task-fractionator-tool-design.md. - The five-principles manifesto this server has to honour:
MANIFESTO.md. - Sibling servers:
mcp-chronometric(time, idle, breaks) andmcp-cognitive-graph(persistent state — where pending tasks will live).
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file neurodock_mcp_task_fractionator-0.0.2.tar.gz.
File metadata
- Download URL: neurodock_mcp_task_fractionator-0.0.2.tar.gz
- Upload date:
- Size: 31.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b89e979215985e779fc8201a4b869d486923cf06b5d9a00c7c2a8d35aae9cd3c
|
|
| MD5 |
b67efcc4a66fa0f343c4ffafc2e1b42f
|
|
| BLAKE2b-256 |
a069ce9366d377fe2333f4b06ec99c8f5e978dc148f223fb21c2c1e86156fd51
|
File details
Details for the file neurodock_mcp_task_fractionator-0.0.2-py3-none-any.whl.
File metadata
- Download URL: neurodock_mcp_task_fractionator-0.0.2-py3-none-any.whl
- Upload date:
- Size: 24.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2f6852fbd15992354ee0296c0ea6298239f47d643dea0d53e241ddeb00cbd9a9
|
|
| MD5 |
a82543a85009afb886279d5be63bfd68
|
|
| BLAKE2b-256 |
adb637608616b53100c98e21a9a182ae8f03c523c2eb5f41f5d150070a683077
|