diff --git a/docs b/docs new file mode 120000 index 0000000..834956d --- /dev/null +++ b/docs @@ -0,0 +1 @@ +src/personal_mcp/docs \ No newline at end of file diff --git a/src/personal_mcp/__main__.py b/src/personal_mcp/__main__.py new file mode 100644 index 0000000..fcee77c --- /dev/null +++ b/src/personal_mcp/__main__.py @@ -0,0 +1,19 @@ +import uvicorn + +from .config import get_settings + + +def main(cli: bool = True) -> None: + """Run the root MCP server.""" + settings = get_settings(cli=cli) + uvicorn.run( + "personal_mcp.web.app:create_app", + factory=True, + host=settings.host, + port=settings.port, + reload=settings.reload, + ) + + +if __name__ == "__main__": + main() diff --git a/src/personal_mcp/config.py b/src/personal_mcp/config.py index 486c96c..9496911 100644 --- a/src/personal_mcp/config.py +++ b/src/personal_mcp/config.py @@ -8,7 +8,7 @@ from pydantic_settings import BaseSettings from pydantic_settings import SettingsConfigDict DEFAULT_ENV_FILE = Path(".env").resolve() -_REPO_ROOT = Path(__file__).resolve().parents[2] +DEFAULT_SITE_DIR = Path("site").resolve() class Mounts(BaseModel): @@ -23,17 +23,21 @@ class Settings(BaseSettings): env_file=DEFAULT_ENV_FILE, env_prefix="PERSONAL_MCP_", extra="ignore", + cli_implicit_flags=True, ) debug: bool = False log_level: str = "info" mounts: Mounts = Field(default_factory=Mounts) - site_dir: DirectoryPath = Field(default=_REPO_ROOT / "site") + site_dir: DirectoryPath = Field(default=DEFAULT_SITE_DIR) + host: str = "localhost" + port: int = 8080 + reload: bool = True @cache -def get_settings(**overrides) -> Settings: - return Settings(**overrides) +def get_settings(*, cli: bool = False, **overrides) -> Settings: + return Settings(**overrides, _cli_parse_args=cli) # pyright: ignore[reportCallIssue] def refresh_settings(**overrides): diff --git a/src/personal_mcp/docs b/src/personal_mcp/docs deleted file mode 120000 index 92a7f82..0000000 --- a/src/personal_mcp/docs +++ /dev/null @@ -1 +0,0 @@ -../../docs \ No newline at end of file diff --git a/docs/architecture.md b/src/personal_mcp/docs/architecture.md similarity index 100% rename from docs/architecture.md rename to src/personal_mcp/docs/architecture.md diff --git a/docs/authoring.md b/src/personal_mcp/docs/authoring.md similarity index 100% rename from docs/authoring.md rename to src/personal_mcp/docs/authoring.md diff --git a/docs/contracts/frontmatter.md b/src/personal_mcp/docs/contracts/frontmatter.md similarity index 100% rename from docs/contracts/frontmatter.md rename to src/personal_mcp/docs/contracts/frontmatter.md diff --git a/docs/contracts/index.md b/src/personal_mcp/docs/contracts/index.md similarity index 100% rename from docs/contracts/index.md rename to src/personal_mcp/docs/contracts/index.md diff --git a/docs/contracts/prompt.md b/src/personal_mcp/docs/contracts/prompt.md similarity index 100% rename from docs/contracts/prompt.md rename to src/personal_mcp/docs/contracts/prompt.md diff --git a/docs/contracts/skill_contract.md b/src/personal_mcp/docs/contracts/skill_contract.md similarity index 100% rename from docs/contracts/skill_contract.md rename to src/personal_mcp/docs/contracts/skill_contract.md diff --git a/docs/contracts/uris.md b/src/personal_mcp/docs/contracts/uris.md similarity index 100% rename from docs/contracts/uris.md rename to src/personal_mcp/docs/contracts/uris.md diff --git a/docs/copilot.md b/src/personal_mcp/docs/copilot.md similarity index 100% rename from docs/copilot.md rename to src/personal_mcp/docs/copilot.md diff --git a/docs/index.md b/src/personal_mcp/docs/index.md similarity index 100% rename from docs/index.md rename to src/personal_mcp/docs/index.md diff --git a/docs/javascripts/mathjax.js b/src/personal_mcp/docs/javascripts/mathjax.js similarity index 100% rename from docs/javascripts/mathjax.js rename to src/personal_mcp/docs/javascripts/mathjax.js diff --git a/docs/javascripts/mermaid-override.js b/src/personal_mcp/docs/javascripts/mermaid-override.js similarity index 100% rename from docs/javascripts/mermaid-override.js rename to src/personal_mcp/docs/javascripts/mermaid-override.js diff --git a/docs/mcp_layout.md b/src/personal_mcp/docs/mcp_layout.md similarity index 100% rename from docs/mcp_layout.md rename to src/personal_mcp/docs/mcp_layout.md diff --git a/docs/prompts/authoring/PROMPT.md b/src/personal_mcp/docs/prompts/authoring/PROMPT.md similarity index 100% rename from docs/prompts/authoring/PROMPT.md rename to src/personal_mcp/docs/prompts/authoring/PROMPT.md diff --git a/docs/prompts/greenfield-architecture/PROMPT.md b/src/personal_mcp/docs/prompts/greenfield-architecture/PROMPT.md similarity index 100% rename from docs/prompts/greenfield-architecture/PROMPT.md rename to src/personal_mcp/docs/prompts/greenfield-architecture/PROMPT.md diff --git a/docs/prompts/jsfiddle-page-layout/PROMPT.md b/src/personal_mcp/docs/prompts/jsfiddle-page-layout/PROMPT.md similarity index 100% rename from docs/prompts/jsfiddle-page-layout/PROMPT.md rename to src/personal_mcp/docs/prompts/jsfiddle-page-layout/PROMPT.md diff --git a/docs/prompts/mcp-consumer-repo-shim/PROMPT.md b/src/personal_mcp/docs/prompts/mcp-consumer-repo-shim/PROMPT.md similarity index 100% rename from docs/prompts/mcp-consumer-repo-shim/PROMPT.md rename to src/personal_mcp/docs/prompts/mcp-consumer-repo-shim/PROMPT.md diff --git a/docs/prompts/nicegui-component-extraction/PROMPT.md b/src/personal_mcp/docs/prompts/nicegui-component-extraction/PROMPT.md similarity index 100% rename from docs/prompts/nicegui-component-extraction/PROMPT.md rename to src/personal_mcp/docs/prompts/nicegui-component-extraction/PROMPT.md diff --git a/docs/prompts/pytest-fill-scaffold/PROMPT.md b/src/personal_mcp/docs/prompts/pytest-fill-scaffold/PROMPT.md similarity index 100% rename from docs/prompts/pytest-fill-scaffold/PROMPT.md rename to src/personal_mcp/docs/prompts/pytest-fill-scaffold/PROMPT.md diff --git a/docs/prompts/pytest-scaffold/PROMPT.md b/src/personal_mcp/docs/prompts/pytest-scaffold/PROMPT.md similarity index 100% rename from docs/prompts/pytest-scaffold/PROMPT.md rename to src/personal_mcp/docs/prompts/pytest-scaffold/PROMPT.md diff --git a/docs/securing.md b/src/personal_mcp/docs/securing.md similarity index 100% rename from docs/securing.md rename to src/personal_mcp/docs/securing.md diff --git a/docs/skills/async-fastapi-sqlmodel/SKILL.md b/src/personal_mcp/docs/skills/async-fastapi-sqlmodel/SKILL.md similarity index 100% rename from docs/skills/async-fastapi-sqlmodel/SKILL.md rename to src/personal_mcp/docs/skills/async-fastapi-sqlmodel/SKILL.md diff --git a/docs/skills/async-fastapi-sqlmodel/references/crud.md b/src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/crud.md similarity index 100% rename from docs/skills/async-fastapi-sqlmodel/references/crud.md rename to src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/crud.md diff --git a/docs/skills/async-fastapi-sqlmodel/references/engine.md b/src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/engine.md similarity index 100% rename from docs/skills/async-fastapi-sqlmodel/references/engine.md rename to src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/engine.md diff --git a/docs/skills/async-fastapi-sqlmodel/references/fastapi.md b/src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/fastapi.md similarity index 100% rename from docs/skills/async-fastapi-sqlmodel/references/fastapi.md rename to src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/fastapi.md diff --git a/docs/skills/async-fastapi-sqlmodel/references/implicit_io.md b/src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/implicit_io.md similarity index 100% rename from docs/skills/async-fastapi-sqlmodel/references/implicit_io.md rename to src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/implicit_io.md diff --git a/docs/skills/async-fastapi-sqlmodel/references/index.md b/src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/index.md similarity index 100% rename from docs/skills/async-fastapi-sqlmodel/references/index.md rename to src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/index.md diff --git a/docs/skills/async-fastapi-sqlmodel/references/observability.md b/src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/observability.md similarity index 100% rename from docs/skills/async-fastapi-sqlmodel/references/observability.md rename to src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/observability.md diff --git a/docs/skills/async-fastapi-sqlmodel/references/session.md b/src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/session.md similarity index 100% rename from docs/skills/async-fastapi-sqlmodel/references/session.md rename to src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/session.md diff --git a/docs/skills/async-fastapi-sqlmodel/references/sqlmodel.md b/src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/sqlmodel.md similarity index 100% rename from docs/skills/async-fastapi-sqlmodel/references/sqlmodel.md rename to src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/sqlmodel.md diff --git a/docs/skills/async-fastapi-sqlmodel/references/template.md b/src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/template.md similarity index 100% rename from docs/skills/async-fastapi-sqlmodel/references/template.md rename to src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/template.md diff --git a/docs/skills/async-fastapi-sqlmodel/references/testing.md b/src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/testing.md similarity index 100% rename from docs/skills/async-fastapi-sqlmodel/references/testing.md rename to src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/testing.md diff --git a/docs/skills/async-fastapi-sqlmodel/references/transactions.md b/src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/transactions.md similarity index 100% rename from docs/skills/async-fastapi-sqlmodel/references/transactions.md rename to src/personal_mcp/docs/skills/async-fastapi-sqlmodel/references/transactions.md diff --git a/docs/skills/copilot-customization/SKILL.md b/src/personal_mcp/docs/skills/copilot-customization/SKILL.md similarity index 100% rename from docs/skills/copilot-customization/SKILL.md rename to src/personal_mcp/docs/skills/copilot-customization/SKILL.md diff --git a/docs/skills/copilot-customization/references/vscode-customization.md b/src/personal_mcp/docs/skills/copilot-customization/references/vscode-customization.md similarity index 100% rename from docs/skills/copilot-customization/references/vscode-customization.md rename to src/personal_mcp/docs/skills/copilot-customization/references/vscode-customization.md diff --git a/docs/skills/fastapi-uv-docker/SKILL.md b/src/personal_mcp/docs/skills/fastapi-uv-docker/SKILL.md similarity index 100% rename from docs/skills/fastapi-uv-docker/SKILL.md rename to src/personal_mcp/docs/skills/fastapi-uv-docker/SKILL.md diff --git a/docs/skills/fastapi-uv-docker/references/docker-cloud-native.md b/src/personal_mcp/docs/skills/fastapi-uv-docker/references/docker-cloud-native.md similarity index 100% rename from docs/skills/fastapi-uv-docker/references/docker-cloud-native.md rename to src/personal_mcp/docs/skills/fastapi-uv-docker/references/docker-cloud-native.md diff --git a/docs/skills/fastapi-uv-docker/references/fastapi-best-practices.md b/src/personal_mcp/docs/skills/fastapi-uv-docker/references/fastapi-best-practices.md similarity index 100% rename from docs/skills/fastapi-uv-docker/references/fastapi-best-practices.md rename to src/personal_mcp/docs/skills/fastapi-uv-docker/references/fastapi-best-practices.md diff --git a/docs/skills/fastapi-uv-docker/references/uv-project-layout.md b/src/personal_mcp/docs/skills/fastapi-uv-docker/references/uv-project-layout.md similarity index 100% rename from docs/skills/fastapi-uv-docker/references/uv-project-layout.md rename to src/personal_mcp/docs/skills/fastapi-uv-docker/references/uv-project-layout.md diff --git a/docs/skills/fastapi-uv-docker/references/uvicorn-settings.md b/src/personal_mcp/docs/skills/fastapi-uv-docker/references/uvicorn-settings.md similarity index 100% rename from docs/skills/fastapi-uv-docker/references/uvicorn-settings.md rename to src/personal_mcp/docs/skills/fastapi-uv-docker/references/uvicorn-settings.md diff --git a/docs/skills/mcp-details/SKILL.md b/src/personal_mcp/docs/skills/mcp-details/SKILL.md similarity index 100% rename from docs/skills/mcp-details/SKILL.md rename to src/personal_mcp/docs/skills/mcp-details/SKILL.md diff --git a/docs/skills/mcp-details/references/ecosystem-and-tooling.md b/src/personal_mcp/docs/skills/mcp-details/references/ecosystem-and-tooling.md similarity index 100% rename from docs/skills/mcp-details/references/ecosystem-and-tooling.md rename to src/personal_mcp/docs/skills/mcp-details/references/ecosystem-and-tooling.md diff --git a/docs/skills/mcp-details/references/mcp-protocol-and-spec.md b/src/personal_mcp/docs/skills/mcp-details/references/mcp-protocol-and-spec.md similarity index 100% rename from docs/skills/mcp-details/references/mcp-protocol-and-spec.md rename to src/personal_mcp/docs/skills/mcp-details/references/mcp-protocol-and-spec.md diff --git a/docs/skills/mcp-details/references/sdk-and-fastmcp.md b/src/personal_mcp/docs/skills/mcp-details/references/sdk-and-fastmcp.md similarity index 100% rename from docs/skills/mcp-details/references/sdk-and-fastmcp.md rename to src/personal_mcp/docs/skills/mcp-details/references/sdk-and-fastmcp.md diff --git a/docs/skills/nicegui/SKILL.md b/src/personal_mcp/docs/skills/nicegui/SKILL.md similarity index 100% rename from docs/skills/nicegui/SKILL.md rename to src/personal_mcp/docs/skills/nicegui/SKILL.md diff --git a/docs/skills/nicegui/references/architecture-and-styling.md b/src/personal_mcp/docs/skills/nicegui/references/architecture-and-styling.md similarity index 100% rename from docs/skills/nicegui/references/architecture-and-styling.md rename to src/personal_mcp/docs/skills/nicegui/references/architecture-and-styling.md diff --git a/docs/skills/nicegui/references/architecture.md b/src/personal_mcp/docs/skills/nicegui/references/architecture.md similarity index 100% rename from docs/skills/nicegui/references/architecture.md rename to src/personal_mcp/docs/skills/nicegui/references/architecture.md diff --git a/docs/skills/nicegui/references/binding-dataclasses.md b/src/personal_mcp/docs/skills/nicegui/references/binding-dataclasses.md similarity index 100% rename from docs/skills/nicegui/references/binding-dataclasses.md rename to src/personal_mcp/docs/skills/nicegui/references/binding-dataclasses.md diff --git a/docs/skills/nicegui/references/fastapi-uvicorn-startup.md b/src/personal_mcp/docs/skills/nicegui/references/fastapi-uvicorn-startup.md similarity index 100% rename from docs/skills/nicegui/references/fastapi-uvicorn-startup.md rename to src/personal_mcp/docs/skills/nicegui/references/fastapi-uvicorn-startup.md diff --git a/docs/skills/nicegui/references/interaction-patterns.md b/src/personal_mcp/docs/skills/nicegui/references/interaction-patterns.md similarity index 100% rename from docs/skills/nicegui/references/interaction-patterns.md rename to src/personal_mcp/docs/skills/nicegui/references/interaction-patterns.md diff --git a/docs/skills/nicegui/references/source-documentation.md b/src/personal_mcp/docs/skills/nicegui/references/source-documentation.md similarity index 100% rename from docs/skills/nicegui/references/source-documentation.md rename to src/personal_mcp/docs/skills/nicegui/references/source-documentation.md diff --git a/docs/skills/nicegui/references/troubleshooting-and-quality-gates.md b/src/personal_mcp/docs/skills/nicegui/references/troubleshooting-and-quality-gates.md similarity index 100% rename from docs/skills/nicegui/references/troubleshooting-and-quality-gates.md rename to src/personal_mcp/docs/skills/nicegui/references/troubleshooting-and-quality-gates.md diff --git a/docs/skills/pydantic-settings/SKILL.md b/src/personal_mcp/docs/skills/pydantic-settings/SKILL.md similarity index 100% rename from docs/skills/pydantic-settings/SKILL.md rename to src/personal_mcp/docs/skills/pydantic-settings/SKILL.md diff --git a/docs/skills/pytesting/SKILL.md b/src/personal_mcp/docs/skills/pytesting/SKILL.md similarity index 100% rename from docs/skills/pytesting/SKILL.md rename to src/personal_mcp/docs/skills/pytesting/SKILL.md diff --git a/docs/skills/pytesting/references/asyncio-testing.md b/src/personal_mcp/docs/skills/pytesting/references/asyncio-testing.md similarity index 100% rename from docs/skills/pytesting/references/asyncio-testing.md rename to src/personal_mcp/docs/skills/pytesting/references/asyncio-testing.md diff --git a/docs/skills/pytesting/references/fastapi-testing.md b/src/personal_mcp/docs/skills/pytesting/references/fastapi-testing.md similarity index 100% rename from docs/skills/pytesting/references/fastapi-testing.md rename to src/personal_mcp/docs/skills/pytesting/references/fastapi-testing.md diff --git a/docs/skills/pytesting/references/naming-and-organization.md b/src/personal_mcp/docs/skills/pytesting/references/naming-and-organization.md similarity index 100% rename from docs/skills/pytesting/references/naming-and-organization.md rename to src/personal_mcp/docs/skills/pytesting/references/naming-and-organization.md diff --git a/docs/skills/pytesting/references/pytest-docs.md b/src/personal_mcp/docs/skills/pytesting/references/pytest-docs.md similarity index 100% rename from docs/skills/pytesting/references/pytest-docs.md rename to src/personal_mcp/docs/skills/pytesting/references/pytest-docs.md diff --git a/docs/skills/pytesting/references/sqlalchemy-testing.md b/src/personal_mcp/docs/skills/pytesting/references/sqlalchemy-testing.md similarity index 100% rename from docs/skills/pytesting/references/sqlalchemy-testing.md rename to src/personal_mcp/docs/skills/pytesting/references/sqlalchemy-testing.md diff --git a/docs/skills/python-logging/SKILL.md b/src/personal_mcp/docs/skills/python-logging/SKILL.md similarity index 100% rename from docs/skills/python-logging/SKILL.md rename to src/personal_mcp/docs/skills/python-logging/SKILL.md diff --git a/docs/skills/python-logging/references/httpx-logging-handler-example.md b/src/personal_mcp/docs/skills/python-logging/references/httpx-logging-handler-example.md similarity index 100% rename from docs/skills/python-logging/references/httpx-logging-handler-example.md rename to src/personal_mcp/docs/skills/python-logging/references/httpx-logging-handler-example.md diff --git a/docs/skills/python-logging/references/json-file-logging.md b/src/personal_mcp/docs/skills/python-logging/references/json-file-logging.md similarity index 100% rename from docs/skills/python-logging/references/json-file-logging.md rename to src/personal_mcp/docs/skills/python-logging/references/json-file-logging.md diff --git a/docs/skills/python-logging/references/network-logging-minimal-example.md b/src/personal_mcp/docs/skills/python-logging/references/network-logging-minimal-example.md similarity index 100% rename from docs/skills/python-logging/references/network-logging-minimal-example.md rename to src/personal_mcp/docs/skills/python-logging/references/network-logging-minimal-example.md diff --git a/docs/skills/python-logging/references/python-logging-docs.md b/src/personal_mcp/docs/skills/python-logging/references/python-logging-docs.md similarity index 100% rename from docs/skills/python-logging/references/python-logging-docs.md rename to src/personal_mcp/docs/skills/python-logging/references/python-logging-docs.md diff --git a/docs/skills/python-typing/SKILL.md b/src/personal_mcp/docs/skills/python-typing/SKILL.md similarity index 100% rename from docs/skills/python-typing/SKILL.md rename to src/personal_mcp/docs/skills/python-typing/SKILL.md diff --git a/docs/skills/python-typing/references/astral-ty.md b/src/personal_mcp/docs/skills/python-typing/references/astral-ty.md similarity index 100% rename from docs/skills/python-typing/references/astral-ty.md rename to src/personal_mcp/docs/skills/python-typing/references/astral-ty.md diff --git a/docs/skills/python-typing/references/index.md b/src/personal_mcp/docs/skills/python-typing/references/index.md similarity index 100% rename from docs/skills/python-typing/references/index.md rename to src/personal_mcp/docs/skills/python-typing/references/index.md diff --git a/docs/skills/python-typing/references/review-workflow.md b/src/personal_mcp/docs/skills/python-typing/references/review-workflow.md similarity index 100% rename from docs/skills/python-typing/references/review-workflow.md rename to src/personal_mcp/docs/skills/python-typing/references/review-workflow.md diff --git a/docs/skills/ruff-linting-formating/SKILL.md b/src/personal_mcp/docs/skills/ruff-linting-formating/SKILL.md similarity index 100% rename from docs/skills/ruff-linting-formating/SKILL.md rename to src/personal_mcp/docs/skills/ruff-linting-formating/SKILL.md diff --git a/docs/skills/ruff-linting-formating/references/ruff-docs.md b/src/personal_mcp/docs/skills/ruff-linting-formating/references/ruff-docs.md similarity index 100% rename from docs/skills/ruff-linting-formating/references/ruff-docs.md rename to src/personal_mcp/docs/skills/ruff-linting-formating/references/ruff-docs.md diff --git a/docs/skills/ruff-linting-formating/references/ruff-integrations.md b/src/personal_mcp/docs/skills/ruff-linting-formating/references/ruff-integrations.md similarity index 100% rename from docs/skills/ruff-linting-formating/references/ruff-integrations.md rename to src/personal_mcp/docs/skills/ruff-linting-formating/references/ruff-integrations.md diff --git a/docs/skills/vscode-configuration/SKILL.md b/src/personal_mcp/docs/skills/vscode-configuration/SKILL.md similarity index 100% rename from docs/skills/vscode-configuration/SKILL.md rename to src/personal_mcp/docs/skills/vscode-configuration/SKILL.md diff --git a/docs/skills/vscode-configuration/references/debug-launch-configurations.md b/src/personal_mcp/docs/skills/vscode-configuration/references/debug-launch-configurations.md similarity index 100% rename from docs/skills/vscode-configuration/references/debug-launch-configurations.md rename to src/personal_mcp/docs/skills/vscode-configuration/references/debug-launch-configurations.md diff --git a/docs/skills/vscode-configuration/references/fastapi-debugpy-launch.md b/src/personal_mcp/docs/skills/vscode-configuration/references/fastapi-debugpy-launch.md similarity index 100% rename from docs/skills/vscode-configuration/references/fastapi-debugpy-launch.md rename to src/personal_mcp/docs/skills/vscode-configuration/references/fastapi-debugpy-launch.md diff --git a/docs/skills/vscode-configuration/references/mcp-server-configuration.md b/src/personal_mcp/docs/skills/vscode-configuration/references/mcp-server-configuration.md similarity index 100% rename from docs/skills/vscode-configuration/references/mcp-server-configuration.md rename to src/personal_mcp/docs/skills/vscode-configuration/references/mcp-server-configuration.md diff --git a/docs/skills/vscode-configuration/references/tasks-json-configuration.md b/src/personal_mcp/docs/skills/vscode-configuration/references/tasks-json-configuration.md similarity index 100% rename from docs/skills/vscode-configuration/references/tasks-json-configuration.md rename to src/personal_mcp/docs/skills/vscode-configuration/references/tasks-json-configuration.md diff --git a/docs/skills/zensical-docs/SKILL.md b/src/personal_mcp/docs/skills/zensical-docs/SKILL.md similarity index 100% rename from docs/skills/zensical-docs/SKILL.md rename to src/personal_mcp/docs/skills/zensical-docs/SKILL.md diff --git a/docs/skills/zensical-docs/references/code-heavy-docs-and-mkdocstrings.md b/src/personal_mcp/docs/skills/zensical-docs/references/code-heavy-docs-and-mkdocstrings.md similarity index 100% rename from docs/skills/zensical-docs/references/code-heavy-docs-and-mkdocstrings.md rename to src/personal_mcp/docs/skills/zensical-docs/references/code-heavy-docs-and-mkdocstrings.md diff --git a/docs/skills/zensical-docs/references/discoverability-and-ia.md b/src/personal_mcp/docs/skills/zensical-docs/references/discoverability-and-ia.md similarity index 100% rename from docs/skills/zensical-docs/references/discoverability-and-ia.md rename to src/personal_mcp/docs/skills/zensical-docs/references/discoverability-and-ia.md diff --git a/docs/skills/zensical-docs/references/documentation-quality.md b/src/personal_mcp/docs/skills/zensical-docs/references/documentation-quality.md similarity index 100% rename from docs/skills/zensical-docs/references/documentation-quality.md rename to src/personal_mcp/docs/skills/zensical-docs/references/documentation-quality.md diff --git a/docs/skills/zensical-docs/references/index.md b/src/personal_mcp/docs/skills/zensical-docs/references/index.md similarity index 100% rename from docs/skills/zensical-docs/references/index.md rename to src/personal_mcp/docs/skills/zensical-docs/references/index.md diff --git a/docs/skills/zensical-docs/references/theme-customization-and-icons.md b/src/personal_mcp/docs/skills/zensical-docs/references/theme-customization-and-icons.md similarity index 100% rename from docs/skills/zensical-docs/references/theme-customization-and-icons.md rename to src/personal_mcp/docs/skills/zensical-docs/references/theme-customization-and-icons.md diff --git a/docs/skills/zensical-docs/references/zensical-features.md b/src/personal_mcp/docs/skills/zensical-docs/references/zensical-features.md similarity index 100% rename from docs/skills/zensical-docs/references/zensical-features.md rename to src/personal_mcp/docs/skills/zensical-docs/references/zensical-features.md diff --git a/docs/stylesheets/mermaid-override.css b/src/personal_mcp/docs/stylesheets/mermaid-override.css similarity index 100% rename from docs/stylesheets/mermaid-override.css rename to src/personal_mcp/docs/stylesheets/mermaid-override.css diff --git a/docs/testing.md b/src/personal_mcp/docs/testing.md similarity index 100% rename from docs/testing.md rename to src/personal_mcp/docs/testing.md diff --git a/docs/usage.md b/src/personal_mcp/docs/usage.md similarity index 100% rename from docs/usage.md rename to src/personal_mcp/docs/usage.md diff --git a/src/personal_mcp/main.py b/src/personal_mcp/main.py deleted file mode 100644 index e0333f9..0000000 --- a/src/personal_mcp/main.py +++ /dev/null @@ -1,20 +0,0 @@ -from fastapi import FastAPI - -from personal_mcp.mcp import create_mcp -from personal_mcp.web.app import create_app as create_fastapi - -__all__ = ["create_app", "main"] - - -def create_app() -> FastAPI: - """Create the HTTP application for ASGI servers using factory mode.""" - return create_fastapi() - - -def main() -> None: - """Run the root MCP server.""" - create_mcp().run() - - -if __name__ == "__main__": - main() diff --git a/src/personal_mcp/skills.py b/src/personal_mcp/skills.py index 46de0f9..e6cd8f8 100644 --- a/src/personal_mcp/skills.py +++ b/src/personal_mcp/skills.py @@ -1,20 +1,34 @@ -from pathlib import Path +from contextlib import ExitStack +from importlib.resources import as_file +from importlib.resources import files +from weakref import finalize from fastmcp.server.providers.skills import SkillsDirectoryProvider def create_skills_provider() -> SkillsDirectoryProvider: """Create the provider for skills packaged with personal-mcp.""" - skills_root = Path(__file__).resolve().parents[1] / "docs" / "skills" - if not skills_root.is_dir(): - raise FileNotFoundError(f"packaged skills directory does not exist: {skills_root}") + skills_resource = files("personal_mcp").joinpath("docs", "skills") + if not skills_resource.is_dir(): + raise FileNotFoundError(f"packaged skills directory does not exist: {skills_resource}") - has_skills = any(skill_dir.is_dir() and (skill_dir / "SKILL.md").is_file() for skill_dir in skills_root.iterdir()) - if not has_skills: - raise ValueError(f"packaged skills directory contains no skills: {skills_root}") - - return SkillsDirectoryProvider( - roots=skills_root, - reload=False, - supporting_files="template", + has_skills = any( + skill_dir.is_dir() and skill_dir.joinpath("SKILL.md").is_file() for skill_dir in skills_resource.iterdir() ) + if not has_skills: + raise ValueError(f"packaged skills directory contains no skills: {skills_resource}") + + resources = ExitStack() + try: + skills_root = resources.enter_context(as_file(skills_resource)) + provider = SkillsDirectoryProvider( + roots=skills_root, + reload=False, + supporting_files="template", + ) + except BaseException: + resources.close() + raise + + finalize(provider, resources.close) + return provider diff --git a/tests/skills/test_provider.py b/tests/skills/test_provider.py index 90f7832..88bf952 100644 --- a/tests/skills/test_provider.py +++ b/tests/skills/test_provider.py @@ -1,4 +1,5 @@ -from pathlib import Path +from importlib.resources import files +from importlib.resources.abc import Traversable import pytest import yaml @@ -11,7 +12,15 @@ from personal_mcp.skills import create_skills_provider pytestmark = pytest.mark.unit -SKILLS_ROOT = Path(__file__).parents[2] / "docs" / "skills" +SKILLS_ROOT = files("personal_mcp").joinpath("docs", "skills") + + +def skill_directories() -> list[Traversable]: + return [ + directory + for directory in SKILLS_ROOT.iterdir() + if directory.is_dir() and directory.joinpath("SKILL.md").is_file() + ] class TestSkillsProvider: @@ -20,7 +29,7 @@ class TestSkillsProvider: @pytest.mark.asyncio async def test_discovers_authored_skills(self) -> None: """Ensures each authored skill is exposed with its description.""" - expected_names = {path.parent.name for path in SKILLS_ROOT.glob("*/SKILL.md")} + expected_names = {directory.name for directory in skill_directories()} mcp = FastMCP("skills-test") mcp.add_provider(create_skills_provider()) @@ -48,10 +57,11 @@ class TestSkillsProvider: def test_frontmatter_names_match_directories(self) -> None: """Ensures provider identity and authored skill names remain aligned.""" - for skill_file in SKILLS_ROOT.glob("*/SKILL.md"): + for directory in skill_directories(): + skill_file = directory.joinpath("SKILL.md") raw = skill_file.read_text(encoding="utf-8") frontmatter = yaml.safe_load(raw.split("---", 2)[1]) assert set(frontmatter) == {"name", "description"} - assert frontmatter["name"] == skill_file.parent.name + assert frontmatter["name"] == directory.name assert frontmatter["description"]