dctracker 1.3.0__tar.gz → 1.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. {dctracker-1.3.0/dctracker.egg-info → dctracker-1.4.0}/PKG-INFO +7 -7
  2. {dctracker-1.3.0 → dctracker-1.4.0}/README.md +4 -4
  3. {dctracker-1.3.0 → dctracker-1.4.0}/dct/__init__.py +1 -1
  4. {dctracker-1.3.0 → dctracker-1.4.0}/dct/cli.py +1 -1
  5. {dctracker-1.3.0 → dctracker-1.4.0}/dct/db.py +6 -0
  6. {dctracker-1.3.0 → dctracker-1.4.0}/dct/mcp/__init__.py +1 -1
  7. {dctracker-1.3.0 → dctracker-1.4.0}/dct/mcp/server.py +88 -105
  8. {dctracker-1.3.0 → dctracker-1.4.0/dctracker.egg-info}/PKG-INFO +7 -7
  9. {dctracker-1.3.0 → dctracker-1.4.0}/dctracker.egg-info/SOURCES.txt +2 -0
  10. {dctracker-1.3.0 → dctracker-1.4.0}/dctracker.egg-info/requires.txt +2 -2
  11. {dctracker-1.3.0 → dctracker-1.4.0}/pyproject.toml +3 -3
  12. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_engine.py +25 -0
  13. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_server_acks.py +1 -1
  14. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_server_alwaysload.py +19 -5
  15. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_server_handoff_view.py +1 -1
  16. dctracker-1.4.0/tests/test_server_protocol.py +99 -0
  17. dctracker-1.4.0/tests/test_server_wire.py +99 -0
  18. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_server_workflow_ops.py +1 -1
  19. {dctracker-1.3.0 → dctracker-1.4.0}/LICENSE +0 -0
  20. {dctracker-1.3.0 → dctracker-1.4.0}/MANIFEST.in +0 -0
  21. {dctracker-1.3.0 → dctracker-1.4.0}/dct/assets/__init__.py +0 -0
  22. {dctracker-1.3.0 → dctracker-1.4.0}/dct/config.py +0 -0
  23. {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/__init__.py +0 -0
  24. {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/analytics.py +0 -0
  25. {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/changelog.py +0 -0
  26. {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/checkpoints.py +0 -0
  27. {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/decisions.py +0 -0
  28. {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/engine.py +0 -0
  29. {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/handoff.py +0 -0
  30. {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/ids.py +0 -0
  31. {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/items.py +0 -0
  32. {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/plans/__init__.py +0 -0
  33. {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/plans/classify.py +0 -0
  34. {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/plans/crud.py +0 -0
  35. {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/plans/ingest.py +0 -0
  36. {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/plans/parser.py +0 -0
  37. {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/projects.py +0 -0
  38. {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/provenance.py +0 -0
  39. {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/sprint.py +0 -0
  40. {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/sprints.py +0 -0
  41. {dctracker-1.3.0 → dctracker-1.4.0}/dct/core/version.py +0 -0
  42. {dctracker-1.3.0 → dctracker-1.4.0}/dct/export.py +0 -0
  43. {dctracker-1.3.0 → dctracker-1.4.0}/dct/hooks/check-changelog-on-stop.sh +0 -0
  44. {dctracker-1.3.0 → dctracker-1.4.0}/dct/hooks/check-changelog.sh +0 -0
  45. {dctracker-1.3.0 → dctracker-1.4.0}/dct/hooks/dct-plan-autoscan.sh +0 -0
  46. {dctracker-1.3.0 → dctracker-1.4.0}/dct/hooks/dct-task-mirror.sh +0 -0
  47. {dctracker-1.3.0 → dctracker-1.4.0}/dct/integrations/__init__.py +0 -0
  48. {dctracker-1.3.0 → dctracker-1.4.0}/dct/integrations/claude.py +0 -0
  49. {dctracker-1.3.0 → dctracker-1.4.0}/dct/migrate.py +0 -0
  50. {dctracker-1.3.0 → dctracker-1.4.0}/dct/paths.py +0 -0
  51. {dctracker-1.3.0 → dctracker-1.4.0}/dct/server.py +0 -0
  52. {dctracker-1.3.0 → dctracker-1.4.0}/dct/services/__init__.py +0 -0
  53. {dctracker-1.3.0 → dctracker-1.4.0}/dct/setup.py +0 -0
  54. {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/clog/SKILL.md +0 -0
  55. {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/commit/SKILL.md +0 -0
  56. {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/dct-import/SKILL.md +0 -0
  57. {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/dct-init/SKILL.md +0 -0
  58. {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/handoff/SKILL.md +0 -0
  59. {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/pickup/SKILL.md +0 -0
  60. {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/plan-resolve-uncertain/SKILL.md +0 -0
  61. {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/plan-status/SKILL.md +0 -0
  62. {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/release/SKILL.md +0 -0
  63. {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/track/SKILL.md +0 -0
  64. {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/track-list/SKILL.md +0 -0
  65. {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/track-resolve/SKILL.md +0 -0
  66. {dctracker-1.3.0 → dctracker-1.4.0}/dct/skills/track-update/SKILL.md +0 -0
  67. {dctracker-1.3.0 → dctracker-1.4.0}/dct/update.py +0 -0
  68. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/__init__.py +0 -0
  69. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/app.py +0 -0
  70. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/__init__.py +0 -0
  71. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/analytics.py +0 -0
  72. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/changelog.py +0 -0
  73. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/decisions.py +0 -0
  74. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/events.py +0 -0
  75. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/handoffs.py +0 -0
  76. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/home.py +0 -0
  77. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/items.py +0 -0
  78. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/plans.py +0 -0
  79. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/projects.py +0 -0
  80. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/blueprints/sprints.py +0 -0
  81. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/changes.py +0 -0
  82. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/serializers.py +0 -0
  83. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/static/app.css +0 -0
  84. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/static/app.js +0 -0
  85. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/static/vendor/SOURCES.txt +0 -0
  86. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/static/vendor/htmx.min.js +0 -0
  87. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/static/vendor/uPlot.iife.min.js +0 -0
  88. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/static/vendor/uPlot.min.css +0 -0
  89. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/analytics.html +0 -0
  90. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/base.html +0 -0
  91. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/changelog/list.html +0 -0
  92. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/decisions/list.html +0 -0
  93. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/handoffs/list.html +0 -0
  94. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/home.html +0 -0
  95. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/item_detail.html +0 -0
  96. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/items_list.html +0 -0
  97. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/partials/_bars.html +0 -0
  98. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/partials/_checkpoint_steps.html +0 -0
  99. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/partials/_items_table.html +0 -0
  100. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/partials/_plan_section.html +0 -0
  101. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/partials/_project_card.html +0 -0
  102. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/plans/detail.html +0 -0
  103. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/plans/list.html +0 -0
  104. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/project_home.html +0 -0
  105. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/sprints/detail.html +0 -0
  106. {dctracker-1.3.0 → dctracker-1.4.0}/dct/web/templates/sprints/list.html +0 -0
  107. {dctracker-1.3.0 → dctracker-1.4.0}/dct/workflows/__init__.py +0 -0
  108. {dctracker-1.3.0 → dctracker-1.4.0}/dct/workflows/session.py +0 -0
  109. {dctracker-1.3.0 → dctracker-1.4.0}/dctracker.egg-info/dependency_links.txt +0 -0
  110. {dctracker-1.3.0 → dctracker-1.4.0}/dctracker.egg-info/entry_points.txt +0 -0
  111. {dctracker-1.3.0 → dctracker-1.4.0}/dctracker.egg-info/top_level.txt +0 -0
  112. {dctracker-1.3.0 → dctracker-1.4.0}/setup.cfg +0 -0
  113. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_adversarial.py +0 -0
  114. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_analytics.py +0 -0
  115. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_changelog.py +0 -0
  116. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_changes.py +0 -0
  117. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_check_numbers.py +0 -0
  118. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_checkpoints.py +0 -0
  119. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_cli_prompts.py +0 -0
  120. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_cli_sprints.py +0 -0
  121. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_cli_web.py +0 -0
  122. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_cli_workflows.py +0 -0
  123. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_config.py +0 -0
  124. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_decisions_crud.py +0 -0
  125. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_export.py +0 -0
  126. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_handoff.py +0 -0
  127. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_hook_bypass.py +0 -0
  128. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_hook_changelog_stop.py +0 -0
  129. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_hook_plan_autoscan.py +0 -0
  130. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_hook_task_mirror.py +0 -0
  131. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_ids.py +0 -0
  132. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_ingest_dogfood.py +0 -0
  133. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_items.py +0 -0
  134. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_migrate.py +0 -0
  135. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_migration.py +0 -0
  136. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_packaging.py +0 -0
  137. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_paths.py +0 -0
  138. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_plan_classify.py +0 -0
  139. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_plan_ingest.py +0 -0
  140. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_plan_parser.py +0 -0
  141. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_plans_crud.py +0 -0
  142. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_projects.py +0 -0
  143. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_provenance.py +0 -0
  144. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_restructure.py +0 -0
  145. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_setup.py +0 -0
  146. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_setup_wiring.py +0 -0
  147. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_sprint.py +0 -0
  148. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_sprints_crud.py +0 -0
  149. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_update.py +0 -0
  150. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_version.py +0 -0
  151. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_web_analytics.py +0 -0
  152. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_web_app.py +0 -0
  153. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_web_items.py +0 -0
  154. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_web_structural.py +0 -0
  155. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_web_views.py +0 -0
  156. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_windows_support.py +0 -0
  157. {dctracker-1.3.0 → dctracker-1.4.0}/tests/test_workflows.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dctracker
3
- Version: 1.3.0
3
+ Version: 1.4.0
4
4
  Summary: Deterministic Context Tracker (dct) — cross-project tracking, changelog, and release tooling for Claude Code.
5
5
  Author-email: fotodeveloper <dev@fotodeveloper.com>
6
6
  License-Expression: MIT
@@ -25,7 +25,7 @@ Requires-Dist: platformdirs>=4.9.6; sys_platform == "win32"
25
25
  Provides-Extra: pg
26
26
  Requires-Dist: psycopg[binary]; extra == "pg"
27
27
  Provides-Extra: mcp
28
- Requires-Dist: mcp[cli]<2,>=1.2; extra == "mcp"
28
+ Requires-Dist: mcp<3,>=2; extra == "mcp"
29
29
  Provides-Extra: web
30
30
  Requires-Dist: flask>=3.0; extra == "web"
31
31
  Requires-Dist: markdown>=3.5; extra == "web"
@@ -34,7 +34,7 @@ Requires-Dist: pytest; extra == "dev"
34
34
  Requires-Dist: pytest-cov; extra == "dev"
35
35
  Provides-Extra: all
36
36
  Requires-Dist: psycopg[binary]; extra == "all"
37
- Requires-Dist: mcp[cli]<2,>=1.2; extra == "all"
37
+ Requires-Dist: mcp<3,>=2; extra == "all"
38
38
  Requires-Dist: flask>=3.0; extra == "all"
39
39
  Requires-Dist: markdown>=3.5; extra == "all"
40
40
  Requires-Dist: pytest; extra == "all"
@@ -122,7 +122,7 @@ markdown, and makes the release commit.
122
122
  - **Decision records** — ADRs, sprint amendments, inline plan decisions with multi-anchor linkage
123
123
  - **LLM-assisted classification** — uncertain plan sections auto-resolved via `claude --print` (haiku by default)
124
124
  - **Passive autoscan hook** — PostToolUse hook re-scans plan-like files in background on every edit
125
- - **MCP server** — native Claude Code integration via FastMCP
125
+ - **MCP server** — native Claude Code integration via the official MCP SDK
126
126
  - **CLI** — fast `dct` command for hooks and scripts
127
127
  - **Skills** — Claude Code slash commands (`/track`, `/clog`, `/dct-import`, `/plan-status`, …)
128
128
  - **Soft deletes** — ledger pattern, nothing is ever lost
@@ -134,9 +134,9 @@ Pick one — whichever matches your Python workflow. The distribution is named *
134
134
 
135
135
  ```bash
136
136
  # Option A: uv tool (recommended — isolated, upgradable, editable for dev)
137
- uv tool install dctracker --with 'mcp[cli]' --with 'psycopg[binary]'
137
+ uv tool install dctracker --with 'mcp' --with 'psycopg[binary]'
138
138
  # Or from source (dev):
139
- uv tool install --editable /path/to/dct --with 'mcp[cli]' --with 'psycopg[binary]'
139
+ uv tool install --editable /path/to/dct --with 'mcp' --with 'psycopg[binary]'
140
140
  # Or straight from GitHub, no clone (e.g. to try main before a release):
141
141
  uv tool install 'dctracker[mcp,pg] @ git+https://github.com/fotodeveloper/dct'
142
142
 
@@ -370,7 +370,7 @@ The `DCT_DATABASE_URL` environment variable overrides `[database].url`. For the
370
370
  .venv/bin/pytest tests/test_plan_ingest.py -v # Ingest + sticky-resolved semantics
371
371
 
372
372
  # MCP server smoke (boot + tool list)
373
- uv run --no-project --with 'mcp[cli]' --with sqlalchemy --with 'psycopg[binary]' \
373
+ uv run --no-project --with 'mcp' --with sqlalchemy --with 'psycopg[binary]' \
374
374
  python -c "import asyncio; from dct.mcp.server import mcp; \
375
375
  print(len(asyncio.run(mcp.list_tools())), 'tools')"
376
376
  ```
@@ -79,7 +79,7 @@ markdown, and makes the release commit.
79
79
  - **Decision records** — ADRs, sprint amendments, inline plan decisions with multi-anchor linkage
80
80
  - **LLM-assisted classification** — uncertain plan sections auto-resolved via `claude --print` (haiku by default)
81
81
  - **Passive autoscan hook** — PostToolUse hook re-scans plan-like files in background on every edit
82
- - **MCP server** — native Claude Code integration via FastMCP
82
+ - **MCP server** — native Claude Code integration via the official MCP SDK
83
83
  - **CLI** — fast `dct` command for hooks and scripts
84
84
  - **Skills** — Claude Code slash commands (`/track`, `/clog`, `/dct-import`, `/plan-status`, …)
85
85
  - **Soft deletes** — ledger pattern, nothing is ever lost
@@ -91,9 +91,9 @@ Pick one — whichever matches your Python workflow. The distribution is named *
91
91
 
92
92
  ```bash
93
93
  # Option A: uv tool (recommended — isolated, upgradable, editable for dev)
94
- uv tool install dctracker --with 'mcp[cli]' --with 'psycopg[binary]'
94
+ uv tool install dctracker --with 'mcp' --with 'psycopg[binary]'
95
95
  # Or from source (dev):
96
- uv tool install --editable /path/to/dct --with 'mcp[cli]' --with 'psycopg[binary]'
96
+ uv tool install --editable /path/to/dct --with 'mcp' --with 'psycopg[binary]'
97
97
  # Or straight from GitHub, no clone (e.g. to try main before a release):
98
98
  uv tool install 'dctracker[mcp,pg] @ git+https://github.com/fotodeveloper/dct'
99
99
 
@@ -327,7 +327,7 @@ The `DCT_DATABASE_URL` environment variable overrides `[database].url`. For the
327
327
  .venv/bin/pytest tests/test_plan_ingest.py -v # Ingest + sticky-resolved semantics
328
328
 
329
329
  # MCP server smoke (boot + tool list)
330
- uv run --no-project --with 'mcp[cli]' --with sqlalchemy --with 'psycopg[binary]' \
330
+ uv run --no-project --with 'mcp' --with sqlalchemy --with 'psycopg[binary]' \
331
331
  python -c "import asyncio; from dct.mcp.server import mcp; \
332
332
  print(len(asyncio.run(mcp.list_tools())), 'tools')"
333
333
  ```
@@ -3,4 +3,4 @@ from importlib.metadata import PackageNotFoundError, version
3
3
  try:
4
4
  __version__ = version("dctracker")
5
5
  except PackageNotFoundError:
6
- __version__ = "1.3.0"
6
+ __version__ = "1.4.0"
@@ -1345,7 +1345,7 @@ def cmd_server(args):
1345
1345
  from dct.mcp.server import mcp
1346
1346
  except ImportError as e:
1347
1347
  print(
1348
- f"MCP server requires extras. Install with: pip install 'dct[mcp]'\n (or reinstall: uv tool install --editable . --with 'mcp[cli]')\nOriginal error: {e}",
1348
+ f"MCP server requires extras. Install with: pip install 'dct[mcp]'\n (or reinstall: uv tool install --editable . --with 'mcp')\nOriginal error: {e}",
1349
1349
  file=sys.stderr,
1350
1350
  )
1351
1351
  sys.exit(1)
@@ -389,6 +389,12 @@ def get_engine(database_url: str) -> sa.Engine:
389
389
  kwargs = {}
390
390
  if database_url.startswith("sqlite"):
391
391
  kwargs["connect_args"] = {"check_same_thread": False}
392
+ if database_url in ("sqlite://", "sqlite:///:memory:"):
393
+ # In-memory sqlite must share ONE connection (StaticPool): the
394
+ # default per-thread pool hands every new thread its own empty
395
+ # database, and the MCP SDK (2.0) runs sync tools in worker
396
+ # threads — tools would see "no such table" (#429).
397
+ kwargs["poolclass"] = sa.pool.StaticPool
392
398
 
393
399
  engine = sa.create_engine(database_url, **kwargs)
394
400
 
@@ -1,3 +1,3 @@
1
- """MCP layer — the FastMCP server exposing dct over the Model Context
1
+ """MCP layer — the MCPServer (SDK 2.0) exposing dct over the Model Context
2
2
  Protocol. Client-neutral: nothing here may know a specific host's name
3
3
  (ADR #51 §6.1); host specifics live in dct.integrations."""