diff --git a/src/personal_mcp/catalog/server.py b/src/personal_mcp/catalog/server.py index e874235..6dbb37a 100644 --- a/src/personal_mcp/catalog/server.py +++ b/src/personal_mcp/catalog/server.py @@ -24,27 +24,53 @@ def _load_skill_registry() -> dict[str, Any]: return registry +def _normalize_pattern(namespace: str, metadata: dict[str, Any]) -> dict[str, Any]: + pattern_id = metadata.get("id", namespace) + capabilities = metadata.get("capabilities", []) + return { + "id": pattern_id, + "namespace": namespace, + "name": metadata.get("name", pattern_id), + "version": metadata.get("version", "0.1.0"), + "description": metadata.get("description", ""), + "tags": metadata.get("tags", []), + "depends_on": metadata.get("depends_on", []), + "capabilities": capabilities, + # Expose resources explicitly for clients that treat resources as the primary interface. + "resources": capabilities, + } + + +def _normalized_patterns() -> list[dict[str, Any]]: + registry = _load_skill_registry() + return [ + _normalize_pattern(namespace, entry["metadata"]) + for namespace, entry in registry.items() + ] + + @catalog_server.resource("resource://catalog/skills_index") def skills_index() -> dict[str, Any]: """Return a compact discovery index for all available pattern modules.""" - registry = _load_skill_registry() - index = [] - for key, entry in registry.items(): - metadata = entry["metadata"] - index.append( - { - "namespace": key, - "id": metadata.get("id", key), - "name": metadata.get("name", key), - "version": metadata.get("version", "0.1.0"), - "capabilities": metadata.get("capabilities", []), - "tags": metadata.get("tags", []), - } - ) - return {"patterns": index} + return {"patterns": _normalized_patterns()} @catalog_server.resource("resource://catalog/skills_details") def skills_details() -> dict[str, Any]: """Return full metadata for all mounted pattern modules.""" return {"patterns": _load_skill_registry()} + + +@catalog_server.resource("resource://catalog/patterns") +def patterns() -> dict[str, Any]: + """Return normalized pattern records for resource-first clients.""" + return {"patterns": _normalized_patterns()} + + +@catalog_server.resource("resource://catalog/patterns_by_id") +def patterns_by_id() -> dict[str, Any]: + """Return normalized pattern records indexed by stable pattern id.""" + indexed: dict[str, Any] = {} + for pattern in _normalized_patterns(): + indexed[pattern["id"]] = pattern + return {"patterns_by_id": indexed}