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 |
|---|---|
list_services | Get list of available PCR services |
list_integrations | Get integrations for a specific PCR service |
list_organizations | Browse and search organizations with filtering options |
get_organization_details | Retrieve comprehensive organization information |
list_repositories | Browse repositories within an organization |
get_repository_details | Retrieve detailed repository information |
list_artifacts | Browse artifacts within a repository |
get_artifact_details | Retrieve detailed artifact information |
list_tags | Browse tags within an artifact |
get_tag_details | Retrieve detailed tag information |
list_services
Get list of available PCR services
Parameters: None
Returns: List of available PCR services
Example Response:
[
{ "name": "gitlab" },
{ "name": "docker" },
{ "name": "artifactory" }
]
list_integrations
Get integrations for a specific PCR service
Parameters:
service(string, required): Name of the PCR service (e.g., "gitlab", "docker", "artifactory")
Returns: List of integrations available for the specified service
Example Response:
[
{
"id": "integration-123",
"name": "Company Container Registry Integration"
},
{
"id": "integration-456",
"name": "Dev Environment Registry"
}
]
list_organizations
Browse and search organizations with filtering options
Parameters:
integration_id(string, required): Unique identifier for the integrationoffset(integer, optional): Number of items to skip (default: 0)limit(integer, optional): Maximum number of items to return (default: 20, max: 100)
Returns: Paginated list of organizations
Example Response:
{
"status": "success",
"message": "Retrieved 15 organizations",
"data": {
"organizations": [
{
"id": "org-123",
"login": "company-dev",
"fork": false,
"changeLog": {
"createdDateTime": "2024-01-15T10:30:00Z",
"lastUpdatedDateTime": "2024-09-01T14:20:00Z",
"createdBy": {
"id": "user-456",
"firstName": "John",
"lastName": "Doe"
}
}
}
],
"pagination": {
"total": 15,
"offset": 0,
"limit": 20
},
"total_count": 15
}
}
get_organization_details
Get detailed information about a specific organization
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 org-123",
"data": {
"organization": {
"id": "org-123",
"login": "company-dev",
"fork": false,
"changeLog": {
"createdDateTime": "2024-01-15T10:30:00Z",
"lastUpdatedDateTime": "2024-09-01T14:20:00Z",
"createdBy": {
"href": "/users/user-456",
"id": "user-456",
"firstName": "John",
"lastName": "Doe",
"avatar": {
"small": "/avatars/user-456-small.png"
}
}
}
}
}
}
list_repositories
Browse repositories within an organization
Parameters:
integration_id(string, required): Unique identifier for the integrationorganization_id(string, required): Unique identifier of the organizationoffset(integer, optional): Number of items to skip (default: 0)limit(integer, optional): Maximum number of items to return (default: 20, max: 100)
Returns: Paginated list of repositories for the specified organization
Example Response:
{
"status": "success",
"message": "Retrieved 8 repositories for organization org-123",
"data": {
"repositories": [
{
"type": "container",
"id": "repo-789",
"name": "web-app",
"description": "Main web application container repository",
"fullName": "company-dev/web-app",
"fork": false,
"language": "Docker",
"changeLog": {
"createdDateTime": "2024-02-01T09:15:00Z",
"lastUpdatedDateTime": "2024-09-10T11:45:00Z"
}
}
],
"pagination": {
"total": 8,
"offset": 0,
"limit": 20
},
"organization_id": "org-123",
"total_count": 8
}
}
get_repository_details
Get detailed information about a specific 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: Comprehensive repository information
Example Response:
{
"status": "success",
"message": "Retrieved repository details for repo-789",
"data": {
"repository": {
"type": "container",
"id": "repo-789",
"name": "web-app",
"description": "Main web application container repository",
"fullName": "company-dev/web-app",
"fork": false,
"language": "Docker",
"additionalInfo": [
{"key": "size", "value": "2.3GB"},
{"key": "downloads", "value": "1,245"}
],
"links": [
{
"rel": "self",
"href": "/repositories/repo-789",
"method": "GET"
}
],
"changeLog": {
"createdDateTime": "2024-02-01T09:15:00Z",
"lastUpdatedDateTime": "2024-09-10T11:45:00Z"
}
},
"organization_id": "org-123"
}
}
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 repositoryoffset(integer, optional): Number of items to skip (default: 0)limit(integer, optional): Maximum number of items to return (default: 20, max: 100)sort(string, optional): Field to sort by and direction (e.g., 'name', '-createdDateTime')
Returns: Paginated list of artifacts for the specified repository
Example Response:
{
"status": "success",
"message": "Retrieved 12 artifacts for repository repo-789",
"data": {
"artifacts": [
{
"href": "/artifacts/artifact-101",
"id": "artifact-101",
"type": "container",
"name": "web-app-v2.1",
"description": "Web application version 2.1 container image",
"changeLog": {
"createdDateTime": "2024-09-05T16:30:00Z",
"lastUpdatedDateTime": "2024-09-05T16:30:00Z"
}
}
],
"pagination": {
"total": 12,
"offset": 0,
"limit": 20
},
"organization_id": "org-123",
"repository_id": "repo-789",
"total_count": 12
}
}
get_artifact_details
Get detailed information about 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: Comprehensive artifact information
Example Response:
{
"status": "success",
"message": "Retrieved artifact details for artifact-101",
"data": {
"artifact": {
"href": "/artifacts/artifact-101",
"id": "artifact-101",
"type": "container",
"name": "web-app-v2.1",
"description": "Web application version 2.1 container image",
"changeLog": {
"createdDateTime": "2024-09-05T16:30:00Z",
"lastUpdatedDateTime": "2024-09-05T16:30:00Z",
"createdBy": {
"id": "user-789",
"firstName": "Jane",
"lastName": "Smith"
}
}
},
"organization_id": "org-123",
"repository_id": "repo-789"
}
}
list_tags
Browse tags within an 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 artifactoffset(integer, optional): Number of items to skip (default: 0)limit(integer, optional): Maximum number of items to return (default: 20, max: 100)sort(string, optional): Field to sort by and direction (e.g., 'name', '-createdDateTime')
Returns: Paginated list of tags for the specified artifact
Example Response:
{
"status": "success",
"message": "Retrieved 5 tags for artifact artifact-101",
"data": {
"tags": [
{
"href": "/tags/tag-201",
"id": "tag-201",
"type": "semantic",
"name": "v2.1.0",
"description": "Stable release version 2.1.0",
"changeLog": {
"createdDateTime": "2024-09-05T16:35:00Z",
"lastUpdatedDateTime": "2024-09-05T16:35:00Z"
}
},
{
"href": "/tags/tag-202",
"id": "tag-202",
"type": "tag",
"name": "latest",
"description": "Latest stable version",
"changeLog": {
"createdDateTime": "2024-09-05T16:40:00Z",
"lastUpdatedDateTime": "2024-09-05T16:40:00Z"
}
}
],
"pagination": {
"total": 5,
"offset": 0,
"limit": 20
},
"organization_id": "org-123",
"repository_id": "repo-789",
"artifact_id": "artifact-101",
"total_count": 5
}
}
get_tag_details
Get detailed information about a specific tag
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 tag-201",
"data": {
"tag": {
"href": "/tags/tag-201",
"id": "tag-201",
"type": "semantic",
"name": "v2.1.0",
"description": "Stable release version 2.1.0",
"changeLog": {
"createdDateTime": "2024-09-05T16:35:00Z",
"lastUpdatedDateTime": "2024-09-05T16:35:00Z",
"createdBy": {
"id": "user-789",
"firstName": "Jane",
"lastName": "Smith"
}
}
},
"organization_id": "org-123",
"repository_id": "repo-789",
"artifact_id": "artifact-101"
}
}
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-pcr": {
"command": "npx",
"args": [
"mcp-remote",
"https://api.unizo.ai/mcp/pcr",
"--allow-http",
"--header",
"apikey:${UNIZO_API_KEY}"
],
"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:
{
"error": {
"code": "REPOSITORY_NOT_FOUND",
"message": "Repository 'example/repo' not found"
}
}
Common error codes:
INTEGRATION_NOT_FOUND: Invalid integration IDREPOSITORY_NOT_FOUND: Repository doesn't exist or no accessARTIFACT_NOT_FOUND: The specified package or image was not foundTAG_NOT_FOUND: Tag not found in repositoryVULNERABILITY_SCAN_FAILED: Issue during vulnerability scanRATE_LIMIT_EXCEEDED: API rate limit reachedUNAUTHORIZED: Invalid API key or insufficient permissions