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": "..."
}