Model Context Protocol (MCP)
Unizo offers an MCP server that integrates package and container registries with any LLM provider supporting the MCP protocol. This enables your AI agent to manage artifacts, analyze dependencies, and automate registry operations across Docker Hub, npm, PyPI, Maven Central, and other registry platforms via a single MCP server.
Supported Tools & Use Cases
The following tools are available in the Packages and Container Registry (PCR) MCP Server:
| Tool Name | Description |
|---|---|
pcr_list_connectors | Get list of available PCR services |
pcr_list_integrations | Get integrations for a specific PCR service |
pcr_list_organizations | Browse and search organizations with filtering options |
pcr_get_organization_details | Retrieve comprehensive organization information |
pcr_list_repositories | Browse repositories within an organization |
pcr_get_repository_details | Retrieve detailed repository information |
pcr_list_artifacts | Browse artifacts within a repository |
pcr_get_artifact_details | Retrieve detailed artifact information |
pcr_list_tags | Browse tags within an artifact |
pcr_get_tag_details | Retrieve detailed tag information |
Tool Reference
Service Discovery Tools
pcr_list_connectors
Get list of available PCR services
Parameters: None
Returns: List of available PCR services (e.g., Docker Hub, Azure Container Registry, GitHub Container Registry)
Example Response:
[
{"name": "docker_hub"},
{"name": "azure_container_registry"},
{"name": "github_container_registry"},
{"name": "google_artifact_registry"}
]
pcr_list_integrations
Get integrations for a specific PCR service
Parameters:
connector(string, required): Name of the service (e.g., "docker_hub", "azure_container_registry")
Returns: List of integrations available for the specified PCR service
Example Response:
[
{
"id": "integration-123",
"name": "Production Docker Registry"
},
{
"id": "integration-456",
"name": "Development ACR"
}
]
Organization Management Tools
pcr_list_organizations
Browse organizations with pagination
Parameters:
integration_id(string, required): Unique identifier for the integration
Returns: Paginated list of organizations
Example Response:
{
"status": "success",
"message": "Retrieved 5 organizations",
"data": {
"organizations": [
{
"id": "acme-inc",
"login": "acme-inc",
"fork": false,
"changeLog": {
"createdDateTime": "2020-01-15T10:00:00Z",
"lastUpdatedDateTime": "2024-11-01T14:30:00Z",
"createdBy": {
"href": "/api/v1/users/admin-001",
"id": "admin-001",
"firstName": "Admin",
"lastName": "User",
"avatar": {
"original": "https://example.com/avatars/admin-001.png",
"small": "https://example.com/avatars/admin-001-small.png",
"medium": "https://example.com/avatars/admin-001-medium.png"
}
},
"lastUpdatedBy": {
"href": "/api/v1/users/admin-001",
"id": "admin-001",
"firstName": "Admin",
"lastName": "User"
}
}
}
],
"pagination": {
"total": 5,
"offset": 0,
"limit": 20,
"next": null,
"previous": null
},
"total_count": 5
}
}
pcr_get_organization_details
Retrieve detailed organization information
Parameters:
integration_id(string, required): Unique identifier for the integrationorganization_id(string, required): Unique identifier of the organization
Returns: Comprehensive organization information
Example Response:
{
"status": "success",
"message": "Retrieved organization details for acme-inc",
"data": {
"organization": {
"id": "acme-inc",
"login": "acme-inc",
"fork": false,
"changeLog": {
"createdDateTime": "2020-01-15T10:00:00Z",
"lastUpdatedDateTime": "2024-11-01T14:30:00Z",
"createdBy": {
"href": "/api/v1/users/admin-001",
"id": "admin-001",
"firstName": "Admin",
"lastName": "User",
"avatar": {
"original": "https://example.com/avatars/admin-001.png",
"xSmall": "https://example.com/avatars/admin-001-xs.png",
"small": "https://example.com/avatars/admin-001-small.png",
"medium": "https://example.com/avatars/admin-001-medium.png",
"large": "https://example.com/avatars/admin-001-large.png"
}
},
"lastUpdatedBy": {
"href": "/api/v1/users/admin-001",
"id": "admin-001",
"firstName": "Admin",
"lastName": "User"
}
}
}
}
}
Repository Management Tools
pcr_list_repositories
Browse repositories within an organization
Parameters:
integration_id(string, required): Unique identifier for the integrationorganization_id(string, required): Unique identifier of the organization
Returns: Paginated list of repositories
Example Response:
{
"status": "success",
"message": "Retrieved 12 repositories for organization acme-inc",
"data": {
"repositories": [
{
"type": "container",
"id": "backend-api",
"name": "backend-api",
"description": "Backend API container image",
"fullName": "acme-inc/backend-api",
"fork": false,
"language": "Python",
"additionalInfo": [
{
"key": "size",
"value": "256MB"
},
{
"key": "pulls",
"value": "10234"
}
],
"links": [
{
"rel": "self",
"href": "/api/v1/pcr/acme-inc/repositories/backend-api",
"method": "GET",
"contentType": "application/json",
"authenticate": true
},
{
"rel": "artifacts",
"href": "/api/v1/pcr/acme-inc/repositories/backend-api/artifacts",
"method": "GET",
"contentType": "application/json",
"authenticate": true
}
],
"changeLog": {
"createdDateTime": "2021-03-15T10:00:00Z",
"lastUpdatedDateTime": "2024-11-05T09:30:00Z",
"createdBy": {
"href": "/api/v1/users/dev-001",
"id": "dev-001",
"firstName": "John",
"lastName": "Doe"
},
"lastUpdatedBy": {
"href": "/api/v1/users/dev-002",
"id": "dev-002",
"firstName": "Jane",
"lastName": "Smith"
}
}
},
{
"type": "package",
"id": "frontend-lib",
"name": "frontend-lib",
"description": "Frontend component library package",
"fullName": "acme-inc/frontend-lib",
"fork": false,
"language": "JavaScript",
"additionalInfo": [
{
"key": "package_type",
"value": "npm"
},
{
"key": "downloads",
"value": "5678"
}
],
"links": [
{
"rel": "self",
"href": "/api/v1/pcr/acme-inc/repositories/frontend-lib",
"method": "GET",
"contentType": "application/json",
"authenticate": true
}
],
"changeLog": {
"createdDateTime": "2021-06-20T11:00:00Z",
"lastUpdatedDateTime": "2024-11-04T16:45:00Z",
"createdBy": {
"href": "/api/v1/users/dev-003",
"id": "dev-003",
"firstName": "Alice",
"lastName": "Johnson"
}
}
}
],
"pagination": {
"total": 12,
"offset": 0,
"limit": 20,
"next": null,
"previous": null
},
"organization_id": "acme-inc",
"total_count": 12
}
}
pcr_get_repository_details
Retrieve comprehensive repository information
Parameters:
integration_id(string, required): Unique identifier for the integrationorganization_id(string, required): Unique identifier of the organizationrepository_id(string, required): Unique identifier of the repository
Returns: Comprehensive repository information
Example Response:
{
"status": "success",
"message": "Retrieved repository details for backend-api",
"data": {
"repository": {
"type": "container",
"id": "backend-api",
"name": "backend-api",
"description": "Backend API container image with FastAPI and PostgreSQL",
"fullName": "acme-inc/backend-api",
"fork": false,
"language": "Python",
"additionalInfo": [
{
"key": "size",
"value": "256MB"
},
{
"key": "pulls",
"value": "10234"
},
{
"key": "stars",
"value": "45"
},
{
"key": "visibility",
"value": "private"
}
],
"links": [
{
"rel": "self",
"href": "/api/v1/pcr/acme-inc/repositories/backend-api",
"method": "GET",
"contentType": "application/json",
"authenticate": true
},
{
"rel": "artifacts",
"href": "/api/v1/pcr/acme-inc/repositories/backend-api/artifacts",
"method": "GET",
"contentType": "application/json",
"authenticate": true
},
{
"rel": "pull",
"href": "docker pull acme-inc/backend-api",
"method": "CLI",
"contentType": "text/plain",
"authenticate": true
}
],
"changeLog": {
"createdDateTime": "2021-03-15T10:00:00Z",
"lastUpdatedDateTime": "2024-11-05T09:30:00Z",
"createdBy": {
"href": "/api/v1/users/dev-001",
"id": "dev-001",
"firstName": "John",
"lastName": "Doe",
"avatar": {
"original": "https://example.com/avatars/dev-001.png",
"small": "https://example.com/avatars/dev-001-small.png"
}
},
"lastUpdatedBy": {
"href": "/api/v1/users/dev-002",
"id": "dev-002",
"firstName": "Jane",
"lastName": "Smith"
}
}
},
"organization_id": "acme-inc"
}
}
Artifact Management Tools
pcr_list_artifacts
Browse artifacts within a repository
Parameters:
integration_id(string, required): Unique identifier for the integrationorganization_id(string, required): Unique identifier of the organizationrepository_id(string, required): Unique identifier of the repository
Returns: Paginated list of artifacts Example Response:
{
"status": "success",
"message": "Retrieved 8 artifacts for repository backend-api",
"data": {
"artifacts": [
{
"href": "/api/v1/pcr/acme-inc/repositories/backend-api/artifacts/sha256-abc123",
"id": "sha256-abc123",
"type": "container",
"name": "backend-api:latest",
"description": "Latest stable version of backend API",
"changeLog": {
"createdDateTime": "2024-11-05T09:30:00Z",
"lastUpdatedDateTime": "2024-11-05T09:30:00Z",
"createdBy": {
"href": "/api/v1/users/dev-001",
"id": "dev-001",
"firstName": "John",
"lastName": "Doe"
}
}
},
{
"href": "/api/v1/pcr/acme-inc/repositories/backend-api/artifacts/sha256-def456",
"id": "sha256-def456",
"type": "container",
"name": "backend-api:v2.5.0",
"description": "Version 2.5.0 release",
"changeLog": {
"createdDateTime": "2024-11-01T14:20:00Z",
"lastUpdatedDateTime": "2024-11-01T14:20:00Z",
"createdBy": {
"href": "/api/v1/users/dev-002",
"id": "dev-002",
"firstName": "Jane",
"lastName": "Smith"
}
}
},
{
"href": "/api/v1/pcr/acme-inc/repositories/backend-api/artifacts/sha256-ghi789",
"id": "sha256-ghi789",
"type": "container",
"name": "backend-api:v2.4.9",
"description": "Version 2.4.9 release",
"changeLog": {
"createdDateTime": "2024-10-28T11:15:00Z",
"createdBy": {
"href": "/api/v1/users/dev-001",
"id": "dev-001",
"firstName": "John",
"lastName": "Doe"
}
}
}
],
"pagination": {
"total": 8,
"offset": 0,
"limit": 20,
"next": null,
"previous": null
},
"organization_id": "acme-inc",
"repository_id": "backend-api",
"total_count": 8
}
}
pcr_get_artifact_details
Retrieve comprehensive artifact information
Parameters:
integration_id(string, required): Unique identifier for the integrationorganization_id(string, required): Unique identifier of the organizationrepository_id(string, required): Unique identifier of the repositoryartifact_id(string, required): Unique identifier of the artifact
Returns: Comprehensive artifact information
Example Response:
{
"status": "success",
"message": "Retrieved artifact details for sha256-abc123",
"data": {
"artifact": {
"href": "/api/v1/pcr/acme-inc/repositories/backend-api/artifacts/sha256-abc123",
"id": "sha256-abc123",
"type": "container",
"name": "backend-api:latest",
"description": "Latest stable version of backend API with security patches",
"changeLog": {
"createdDateTime": "2024-11-05T09:30:00Z",
"lastUpdatedDateTime": "2024-11-05T09:30:00Z",
"createdBy": {
"href": "/api/v1/users/dev-001",
"id": "dev-001",
"firstName": "John",
"lastName": "Doe",
"avatar": {
"original": "https://example.com/avatars/dev-001.png",
"xSmall": "https://example.com/avatars/dev-001-xs.png",
"small": "https://example.com/avatars/dev-001-small.png",
"medium": "https://example.com/avatars/dev-001-medium.png",
"large": "https://example.com/avatars/dev-001-large.png"
}
},
"lastUpdatedBy": {
"href": "/api/v1/users/dev-001",
"id": "dev-001",
"firstName": "John",
"lastName": "Doe"
}
}
},
"organization_id": "acme-inc",
"repository_id": "backend-api"
}
}
Tag Management Tools
pcr_list_tags
Browse tags for a specific artifact
Parameters:
integration_id(string, required): Unique identifier for the integrationorganization_id(string, required): Unique identifier of the organizationrepository_id(string, required): Unique identifier of the repositoryartifact_id(string, required): Unique identifier of the artifact
Returns: Paginated list of tags Example Response:
{
"status": "success",
"message": "Retrieved 5 tags for artifact sha256-abc123",
"data": {
"tags": [
{
"href": "/api/v1/pcr/acme-inc/repositories/backend-api/artifacts/sha256-abc123/tags/latest",
"id": "latest",
"type": "tag",
"name": "latest",
"description": "Latest stable release",
"changeLog": {
"createdDateTime": "2024-11-05T09:30:00Z",
"lastUpdatedDateTime": "2024-11-05T09:30:00Z",
"createdBy": {
"href": "/api/v1/users/dev-001",
"id": "dev-001",
"firstName": "John",
"lastName": "Doe"
}
}
},
{
"href": "/api/v1/pcr/acme-inc/repositories/backend-api/artifacts/sha256-abc123/tags/v2.5.0",
"id": "v2.5.0",
"type": "semantic",
"name": "v2.5.0",
"description": "Semantic version 2.5.0",
"changeLog": {
"createdDateTime": "2024-11-05T09:30:00Z",
"createdBy": {
"href": "/api/v1/users/dev-001",
"id": "dev-001",
"firstName": "John",
"lastName": "Doe"
}
}
},
{
"href": "/api/v1/pcr/acme-inc/repositories/backend-api/artifacts/sha256-abc123/tags/stable",
"id": "stable",
"type": "tag",
"name": "stable",
"description": "Stable production release",
"changeLog": {
"createdDateTime": "2024-11-05T09:30:00Z",
"createdBy": {
"href": "/api/v1/users/dev-002",
"id": "dev-002",
"firstName": "Jane",
"lastName": "Smith"
}
}
}
],
"pagination": {
"total": 5,
"offset": 0,
"limit": 20,
"next": null,
"previous": null
},
"organization_id": "acme-inc",
"repository_id": "backend-api",
"artifact_id": "sha256-abc123",
"total_count": 5
}
}
pcr_get_tag_details
Retrieve detailed tag information Parameters:
integration_id(string, required): Unique identifier for the integrationorganization_id(string, required): Unique identifier of the organizationrepository_id(string, required): Unique identifier of the repositoryartifact_id(string, required): Unique identifier of the artifacttag_id(string, required): Unique identifier of the tag
Returns: Comprehensive tag information
Example Response:
{
"status": "success",
"message": "Retrieved tag details for latest",
"data": {
"tag": {
"href": "/api/v1/pcr/acme-inc/repositories/backend-api/artifacts/sha256-abc123/tags/latest",
"id": "latest",
"type": "tag",
"name": "latest",
"description": "Latest stable release with all security patches applied",
"changeLog": {
"createdDateTime": "2024-11-05T09:30:00Z",
"lastUpdatedDateTime": "2024-11-05T09:30:00Z",
"createdBy": {
"href": "/api/v1/users/dev-001",
"id": "dev-001",
"firstName": "John",
"lastName": "Doe",
"avatar": {
"original": "https://example.com/avatars/dev-001.png",
"xSmall": "https://example.com/avatars/dev-001-xs.png",
"small": "https://example.com/avatars/dev-001-small.png",
"medium": "https://example.com/avatars/dev-001-medium.png",
"large": "https://example.com/avatars/dev-001-large.png"
}
},
"lastUpdatedBy": {
"href": "/api/v1/users/dev-001",
"id": "dev-001",
"firstName": "John",
"lastName": "Doe"
}
}
},
"organization_id": "acme-inc",
"repository_id": "backend-api",
"artifact_id": "sha256-abc123"
}
}
Installation
Prerequisites
- A Unizo API key
- An active PCR integration (Amazon ECR, Docker Hub, Google Artifact Registry, GitHub Container Registry, GitLab Container Registry, JFrog Artifactory, Microsoft ACR, Nexus)
- Node.js v20 or higher
MCP Configuration
Here is an example configuration for setting up the Unizo Packages And Container Registry MCP Server:
{
"mcpServers": {
"unizo": {
"command": "npx",
"args": [
"mcp-remote",
"https://api.unizo.ai/mcp",
"--header",
"apikey:${UNIZO_API_KEY}",
"--header",
"x-mcp-scopes:pcr"
],
"env": {
"UNIZO_API_KEY": "your_api_key"
}
}
}
}
Client Setup
For detailed setup instructions with specific AI clients:
Environment Variables
The following environment variables are required:
UNIZO_API_KEY: Your Unizo API key Your Unizo API key
Error Handling
All tools return errors in a consistent format:
{
"status": "error",
"message": "Repository 'backend-api' not found in organization 'acme-inc'",
"traceback": "..."
}