Skip to main content

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 NameDescription
pcr_list_connectorsGet list of available PCR services
pcr_list_integrationsGet integrations for a specific PCR service
pcr_list_organizationsBrowse and search organizations with filtering options
pcr_get_organization_detailsRetrieve comprehensive organization information
pcr_list_repositoriesBrowse repositories within an organization
pcr_get_repository_detailsRetrieve detailed repository information
pcr_list_artifactsBrowse artifacts within a repository
pcr_get_artifact_detailsRetrieve detailed artifact information
pcr_list_tagsBrowse tags within an artifact
pcr_get_tag_detailsRetrieve 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 integration
  • organization_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 integration
  • organization_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 integration
  • organization_id (string, required): Unique identifier of the organization
  • repository_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 integration
  • organization_id (string, required): Unique identifier of the organization
  • repository_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 integration
  • organization_id (string, required): Unique identifier of the organization
  • repository_id (string, required): Unique identifier of the repository
  • artifact_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 integration
  • organization_id (string, required): Unique identifier of the organization
  • repository_id (string, required): Unique identifier of the repository
  • artifact_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 integration
  • organization_id (string, required): Unique identifier of the organization
  • repository_id (string, required): Unique identifier of the repository
  • artifact_id (string, required): Unique identifier of the artifact
  • tag_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:

Error Handling​

All tools return errors in a consistent format:

{
"status": "error",
"message": "Repository 'backend-api' not found in organization 'acme-inc'",
"traceback": "..."
}