diff --git a/.cursor/mcp.json b/.cursor/mcp.json
index a20e1d1..a524ffa 100644
--- a/.cursor/mcp.json
+++ b/.cursor/mcp.json
@@ -5,11 +5,11 @@
       "args": [
         "run",
         "--directory",
-        "/home/ralian/pygitweb",
+        "pygittools-mcp",
         "pygittools-mcp"
       ],
       "env": {
-        "PYGITTOOLS_REPO": "/home/ralian/pygitweb"
+        "PYGITTOOLS_REPO": ".."
       }
     }
   }
diff --git a/pygittools-mcp/pygittools_mcp/__init__.py b/pygittools-mcp/pygittools_mcp/__init__.py
new file mode 100644
index 0000000..8fadd53
--- /dev/null
+++ b/pygittools-mcp/pygittools_mcp/__init__.py
@@ -0,0 +1,3 @@
+from __future__ import annotations
+
+__all__ = ["mcp_server"]
diff --git a/pygittools-mcp/pygittools_mcp/mcp_server.py b/pygittools-mcp/pygittools_mcp/mcp_server.py
new file mode 100644
index 0000000..a6df3e5
--- /dev/null
+++ b/pygittools-mcp/pygittools_mcp/mcp_server.py
@@ -0,0 +1,120 @@
+"""MCP server exposing pygittools task boards to AI clients."""
+
+from __future__ import annotations
+
+import json
+import os
+
+from mcp.server.fastmcp import FastMCP
+
+from pygittools.tasks_query import (
+	BoardColumnView,
+	BoardView,
+	RepoLocation,
+	TaskView,
+	discover_repo_path,
+	get_board_tasks_grouped,
+	get_task_view,
+	list_boards,
+	list_tasks,
+	open_repository,
+	resolve_repo_location,
+)
+
+mcp = FastMCP(
+	"pygittools-tasks",
+	instructions=(
+		"Read task boards stored as Git annotated tags. "
+		"Boards live under refs/tags/boards/, tasks under refs/tags/tasks/, "
+		"and comments under refs/tags/comments/. "
+		"Set PYGITTOOLS_REPO to a repository path, or PYGITWEB_PROJECTROOT plus a project name."
+	),
+	json_response=True,
+)
+
+
+def _repo_for_tool(project: str | None = None) -> RepoLocation:
+	return resolve_repo_location(project=project)
+
+
+@mcp.tool(title="List boards")
+def list_boards_tool(project: str | None = None) -> list[BoardView]:
+	"""List all task boards in the configured repository."""
+	location = _repo_for_tool(project)
+	repo = open_repository(location)
+	return list_boards(repo)
+
+
+@mcp.tool(title="List tasks")
+def list_tasks_tool(
+	board: str = "Tasks",
+	project: str | None = None,
+	include_comments: bool = True,
+) -> list[TaskView]:
+	"""List tasks on a board, optionally including comment bodies."""
+	location = _repo_for_tool(project)
+	repo = open_repository(location)
+	try:
+		return list_tasks(repo, board, include_comments=include_comments)
+	except KeyError as exc:
+		raise ValueError(str(exc)) from exc
+
+
+@mcp.tool(title="Get task")
+def get_task_tool(task_ref: str, project: str | None = None) -> TaskView:
+	"""Get one task by ref slug (task_123) or full ref (refs/tags/tasks/task_123)."""
+	location = _repo_for_tool(project)
+	repo = open_repository(location)
+	try:
+		return get_task_view(repo, task_ref, include_comments=True)
+	except KeyError as exc:
+		raise ValueError(str(exc)) from exc
+
+
+@mcp.tool(title="Board grouped by status")
+def board_by_status_tool(
+	board: str = "Tasks",
+	project: str | None = None,
+	include_comments: bool = True,
+) -> list[BoardColumnView]:
+	"""Return board tasks grouped into status columns (TODO, IN_PROGRESS, etc.)."""
+	location = _repo_for_tool(project)
+	repo = open_repository(location)
+	try:
+		return get_board_tasks_grouped(repo, board, include_comments=include_comments)
+	except KeyError as exc:
+		raise ValueError(str(exc)) from exc
+
+
+@mcp.resource("board://{board_name}")
+def board_resource(board_name: str) -> str:
+	"""JSON snapshot of a board grouped by status."""
+	location = resolve_repo_location()
+	repo = open_repository(location)
+	columns = get_board_tasks_grouped(repo, board_name, include_comments=True)
+	return json.dumps(columns, indent=2)
+
+
+@mcp.resource("task://{task_ref}")
+def task_resource(task_ref: str) -> str:
+	"""JSON snapshot of a single task with comments."""
+	location = resolve_repo_location()
+	repo = open_repository(location)
+	task = get_task_view(repo, task_ref, include_comments=True)
+	return json.dumps(task, indent=2)
+
+
+def main() -> None:
+	repo_env = os.environ.get("PYGITTOOLS_REPO", "").strip()
+	if not repo_env:
+		try:
+			discovered = discover_repo_path()
+		except FileNotFoundError:
+			discovered = None
+		if discovered is not None:
+			os.environ["PYGITTOOLS_REPO"] = str(discovered)
+	mcp.run(transport="stdio")
+
+
+if __name__ == "__main__":
+	main()
diff --git a/pygittools-mcp/pyproject.toml b/pygittools-mcp/pyproject.toml
new file mode 100644
index 0000000..f9b421c
--- /dev/null
+++ b/pygittools-mcp/pyproject.toml
@@ -0,0 +1,27 @@
+[build-system]
+requires = ["setuptools>=61", "wheel"]
+build-backend = "setuptools.build_meta"
+
+[project]
+name = "pygittools-mcp"
+version = "0.1.0"
+description = "MCP server exposing pygittools task boards to AI clients."
+requires-python = ">=3.11"
+dependencies = [
+    "pygittools>=0.2.1",
+    "mcp>=1.28.0",
+]
+
+[project.scripts]
+pygittools-mcp = "pygittools_mcp.mcp_server:main"
+
+[tool.setuptools]
+packages = ["pygittools_mcp"]
+
+[tool.setuptools.package-dir]
+pygittools_mcp = "."
+
+[tool.uv.sources]
+pygittools = { workspace = true }
+
+
diff --git a/pygittools/mcp_server.py b/pygittools/mcp_server.py
index a6df3e5..6acf12f 100644
--- a/pygittools/mcp_server.py
+++ b/pygittools/mcp_server.py
@@ -1,120 +1,8 @@
-"""MCP server exposing pygittools task boards to AI clients."""
+"""Compatibility shim for the MCP server.
 
-from __future__ import annotations
-
-import json
-import os
-
-from mcp.server.fastmcp import FastMCP
-
-from pygittools.tasks_query import (
-	BoardColumnView,
-	BoardView,
-	RepoLocation,
-	TaskView,
-	discover_repo_path,
-	get_board_tasks_grouped,
-	get_task_view,
-	list_boards,
-	list_tasks,
-	open_repository,
-	resolve_repo_location,
-)
-
-mcp = FastMCP(
-	"pygittools-tasks",
-	instructions=(
-		"Read task boards stored as Git annotated tags. "
-		"Boards live under refs/tags/boards/, tasks under refs/tags/tasks/, "
-		"and comments under refs/tags/comments/. "
-		"Set PYGITTOOLS_REPO to a repository path, or PYGITWEB_PROJECTROOT plus a project name."
-	),
-	json_response=True,
-)
-
-
-def _repo_for_tool(project: str | None = None) -> RepoLocation:
-	return resolve_repo_location(project=project)
-
-
-@mcp.tool(title="List boards")
-def list_boards_tool(project: str | None = None) -> list[BoardView]:
-	"""List all task boards in the configured repository."""
-	location = _repo_for_tool(project)
-	repo = open_repository(location)
-	return list_boards(repo)
-
-
-@mcp.tool(title="List tasks")
-def list_tasks_tool(
-	board: str = "Tasks",
-	project: str | None = None,
-	include_comments: bool = True,
-) -> list[TaskView]:
-	"""List tasks on a board, optionally including comment bodies."""
-	location = _repo_for_tool(project)
-	repo = open_repository(location)
-	try:
-		return list_tasks(repo, board, include_comments=include_comments)
-	except KeyError as exc:
-		raise ValueError(str(exc)) from exc
-
-
-@mcp.tool(title="Get task")
-def get_task_tool(task_ref: str, project: str | None = None) -> TaskView:
-	"""Get one task by ref slug (task_123) or full ref (refs/tags/tasks/task_123)."""
-	location = _repo_for_tool(project)
-	repo = open_repository(location)
-	try:
-		return get_task_view(repo, task_ref, include_comments=True)
-	except KeyError as exc:
-		raise ValueError(str(exc)) from exc
-
-
-@mcp.tool(title="Board grouped by status")
-def board_by_status_tool(
-	board: str = "Tasks",
-	project: str | None = None,
-	include_comments: bool = True,
-) -> list[BoardColumnView]:
-	"""Return board tasks grouped into status columns (TODO, IN_PROGRESS, etc.)."""
-	location = _repo_for_tool(project)
-	repo = open_repository(location)
-	try:
-		return get_board_tasks_grouped(repo, board, include_comments=include_comments)
-	except KeyError as exc:
-		raise ValueError(str(exc)) from exc
-
-
-@mcp.resource("board://{board_name}")
-def board_resource(board_name: str) -> str:
-	"""JSON snapshot of a board grouped by status."""
-	location = resolve_repo_location()
-	repo = open_repository(location)
-	columns = get_board_tasks_grouped(repo, board_name, include_comments=True)
-	return json.dumps(columns, indent=2)
-
-
-@mcp.resource("task://{task_ref}")
-def task_resource(task_ref: str) -> str:
-	"""JSON snapshot of a single task with comments."""
-	location = resolve_repo_location()
-	repo = open_repository(location)
-	task = get_task_view(repo, task_ref, include_comments=True)
-	return json.dumps(task, indent=2)
-
-
-def main() -> None:
-	repo_env = os.environ.get("PYGITTOOLS_REPO", "").strip()
-	if not repo_env:
-		try:
-			discovered = discover_repo_path()
-		except FileNotFoundError:
-			discovered = None
-		if discovered is not None:
-			os.environ["PYGITTOOLS_REPO"] = str(discovered)
-	mcp.run(transport="stdio")
+Use the dedicated ``pygittools-mcp`` package for the actual implementation.
+"""
 
+from __future__ import annotations
 
-if __name__ == "__main__":
-	main()
+from pygittools_mcp.mcp_server import *  # noqa: F401,F403
diff --git a/pygittools/pyproject.toml b/pygittools/pyproject.toml
index 537ec27..23ef0e5 100644
--- a/pygittools/pyproject.toml
+++ b/pygittools/pyproject.toml
@@ -11,14 +11,12 @@ license = "MIT"
 license-files = ["LICENSE"]
 requires-python = ">=3.11"
 dependencies = [
-    "mcp>=1.28.0",
     "pygit2>=1.12.0",
     "uni-curses>=3.1.2",
 ]
 
 [project.scripts]
 pgt = "pygittools.main:main"
-pygittools-mcp = "pygittools.mcp_server:main"
 
 [tool.setuptools]
 packages = ["pygittools", "pygittools.tui", "pygittools.tui.pages"]
diff --git a/pyproject.toml b/pyproject.toml
index 7143056..d14e383 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -14,7 +14,7 @@ dev = [
 ]
 
 [tool.uv.workspace]
-members = ["postgit", "pygittools", "pygitweb", "pygitweb_pytesthtml"]
+members = ["postgit", "pygittools", "pygittools-mcp", "pygitweb", "pygitweb_pytesthtml"]
 
 [tool.uv]
 package = false
diff --git a/uv.lock b/uv.lock
index 0c2eb98..32c0b0f 100644
--- a/uv.lock
+++ b/uv.lock
@@ -12,6 +12,7 @@ resolution-markers = [
 members = [
     "postgit",
     "pygittools",
+    "pygittools-mcp",
     "pygitweb",
     "pygitweb-pytesthtml",
     "pygitweb-workspace",
@@ -1152,24 +1153,37 @@ wheels = [
 
 [[package]]
 name = "pygittools"
-version = "0.2.0"
+version = "0.2.1"
 source = { editable = "pygittools" }
 dependencies = [
-    { name = "mcp" },
     { name = "pygit2" },
     { name = "uni-curses" },
 ]
 
 [package.metadata]
 requires-dist = [
-    { name = "mcp", specifier = ">=1.28.0" },
     { name = "pygit2", specifier = ">=1.12.0" },
     { name = "uni-curses", specifier = ">=3.1.2" },
 ]
 
 [[package]]
+name = "pygittools-mcp"
+version = "0.1.0"
+source = { editable = "pygittools-mcp" }
+dependencies = [
+    { name = "mcp" },
+    { name = "pygittools" },
+]
+
+[package.metadata]
+requires-dist = [
+    { name = "mcp", specifier = ">=1.28.0" },
+    { name = "pygittools", editable = "pygittools" },
+]
+
+[[package]]
 name = "pygitweb"
-version = "0.2.0"
+version = "0.2.1"
 source = { editable = "pygitweb" }
 dependencies = [
     { name = "fastapi", extra = ["standard-no-fastapi-cloud-cli"] },
