A Model Context Protocol (MCP) server that provides AI agents with access to the Upbound Marketplace API. This server enables agents to search, discover, and manage marketplace packages and repositories, with a focus on helping users leverage marketplace resources for Crossplane compositions and package management.
Built using the mcp-go framework for robust MCP protocol compliance and performance.
- Package Search: Search for packages across the Upbound Marketplace with advanced filtering
- Package Metadata: Get detailed information about packages including CRDs, examples, and documentation
- Asset Access: Retrieve package assets like CRDs, examples, docs, and package files
- Repository Management: Browse and manage repositories
- Authentication: UP CLI-based authentication for accessing private resources
- Multi-API Support: Supports both v1 and v2 marketplace APIs
- Composition Focus: Specialized tools for working with Crossplane compositions and functions
Build the Docker image locally:
git clone https://github.com/upbound/marketplace-mcp-server.git
cd marketplace-mcp-server
docker build --target stdio -t marketplace-mcp-server:latest .
Note: You must have the UP CLI installed and authenticated for the server to access marketplace resources. Run up login
before using the MCP server.
git clone https://github.com/upbound/marketplace-mcp-server.git
cd marketplace-mcp-server
go build ./cmd/mcp-server
Add the following to your Claude Desktop configuration file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%/Claude/claude_desktop_config.json
{
"mcpServers": {
"marketplace": {
"command": "docker",
"args": [
"run",
"--name", "mcp-marketplace",
"--rm",
"-i",
"-v", "/Users/your-username/.up:/mcp/.up:ro",
"marketplace-mcp-server:latest"
]
}
}
}
Important: Replace /Users/your-username/.up
with your actual UP CLI config directory path:
- macOS/Linux:
~/.up
(typically/Users/username/.up
or/home/username/.up
) - Windows:
%USERPROFILE%\.up
For agents that support MCP, configure them to connect to the server using stdio transport:
# Using the built binary
./mcp-server
# Using Docker
docker run -i --rm -v ~/.up:/mcp/.up:ro marketplace-mcp-server:latest
The server also supports HTTP transport for integration with web applications and REST clients:
# Start HTTP server locally
./mcp-http
# Or using Docker
docker run --rm -p 8765:8765 -v ~/.up:/mcp/.up:ro marketplace-mcp-server-http:latest
The HTTP server provides a JSON-RPC 2.0 API at http://localhost:8765/mcp
. Example usage:
# List available tools
curl -X POST http://localhost:8765/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}'
# Search for packages
curl -X POST http://localhost:8765/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": {"name": "search_packages", "arguments": {"query": "aws", "size": 5}}}'
The HTTP interface operates in stateless mode, so no session initialization is required.
Search for packages in the Upbound Marketplace.
Parameters:
query
(string): Search query for packagesfamily
(string): Family repository key to filter bypackage_type
(string): Type of package (provider, configuration, function)account_name
(string): Account/organization name to filter bytier
(string): Package tier (official, community, etc.)public
(boolean): Filter by public/private packagessize
(integer): Number of results to return (max 500, default 20)page
(integer): Page number (0-indexed, default 0)use_v1
(boolean): Use v1 API instead of v2 (default false)
Example:
{
"name": "search_packages",
"arguments": {
"query": "aws provider",
"tier": "official",
"public": true,
"size": 10
}
}
Get detailed metadata for a specific package.
Parameters:
account
(string, required): Account/organization namerepository
(string, required): Repository nameversion
(string): Package version (optional, gets latest if not specified)use_v1
(boolean): Use v1 API instead of v2 (default false)
Example:
{
"name": "get_package_metadata",
"arguments": {
"account": "upbound",
"repository": "provider-aws"
}
}
Get assets (documentation, icons, release notes, etc.) for a specific package version.
Parameters:
account
(string, required): Account/organization namerepository
(string, required): Repository nameversion
(string, required): Package version or 'latest'asset_type
(string, required): Type of asset (docs, icon, readme, releaseNotes, sbom)
Example:
{
"name": "get_package_assets",
"arguments": {
"account": "upbound",
"repository": "provider-aws",
"version": "latest",
"asset_type": "docs"
}
}
Get repositories for an account.
Parameters:
account
(string, required): Account/organization namefilter
(string): AIP-160 formatted filter (v2 only)size
(integer): Number of results to return (default 20)page
(integer): Page number (0-indexed, default 0)use_v1
(boolean): Use v1 API instead of v2 (default false)
Example:
{
"name": "get_repositories",
"arguments": {
"account": "upbound",
"filter": "type = 'provider' AND public = true"
}
}
Reload authentication from UP CLI configuration. Useful when switching UP CLI profiles.
Parameters:
- No parameters required
Example:
{
"name": "reload_auth",
"arguments": {}
}
Get package version resources for a supplied repository name.
Parameters:
account
(string, required): Account/organization name. For example upbound.repository_name
(string, required): The name of the repository. For example provider-aws-s3.version
(string, required): The version of the package. For example v1.23.1.
Example:
{
"name": "get_package_version_resources",
"arguments": {
"account": "upbound",
"repository_name": "provider-aws-s3",
"version": "v1.23.1
}
}
Get package version composition resources for a supplied group, kind and version and composition.
Parameters:
account
(string, required): Account/organization name. For example upbound.repository_name
(string, required): The name of the repository. For example configuration-caas.version
(string, required): The version of the package. For example v0.4.0.resource_group
(string, required): The group of the resource. For example caas.upbound.io.resource_kind
(string, required): The kind of the resource. For example XCluster.composition_name
(string, required): The kind of the resource. For example xclusters.caas.upbound.io.
Example:
{
"name": "get_package_version_composition_resources",
"arguments": {
"account": "upbound",
"repository_name": "configuration-caas",
"version": "v0.4.0",
"resource_group": "caas.upbound.io",
"resource_kind": "XCluster",
"composition_name": "xclusters.caas.upbound.io"
}
}
Get package version resources for a supplied group, kind and version.
Parameters:
account
(string, required): Account/organization name. For example upbound.repository_name
(string, required): The name of the repository. For example provider-aws-s3.version
(string, required): The version of the package. For example v1.23.1.resource_group
(string, required): The group of the resource. For example s3.aws.upbound.io.resource_kind
(string, required): The kind of the resource. For example Bucket.
Example:
{
"name": "get_package_version_groupkind_resources",
"arguments": {
"account": "upbound",
"repository_name": "provider-aws-s3",
"version": "v1.23.1",
"resource_group": "s3.aws.upbound.io",
"resource_kind": "Bucket"
}
}
Get package version examples for a supplied group, kind and version.
Parameters:
account
(string, required): Account/organization name. For example upbound.repository_name
(string, required): The name of the repository. For example provider-aws-s3.version
(string, required): The version of the package. For example v1.23.1.resource_group
(string, required): The group of the resource. For example s3.aws.upbound.io.resource_kind
(string, required): The kind of the resource. For example Bucket.
Example:
{
"name": "get_package_version_groupkind_resources",
"arguments": {
"account": "upbound",
"repository_name": "provider-aws-s3",
"version": "v1.23.1",
"resource_group": "s3.aws.upbound.io",
"resource_kind": "Bucket"
}
}
The MCP server uses UP CLI authentication for accessing marketplace resources:
- Install the UP CLI: https://docs.upbound.io/cli/
- Authenticate with your Upbound account:
up login
- Ensure your UP CLI config is accessible to the Docker container
The server automatically loads authentication from your UP CLI configuration when the container starts. Make sure to mount your UP CLI config directory:
-v ~/.up:/mcp/.up:ro
If you have multiple UP CLI profiles, you can:
- Switch profiles using
up profile use <profile-name>
- Use the
reload_auth
tool to reload the new authentication without restarting the server
The server will automatically use your authenticated session to access private repositories and resources that your account has permission to view.
The v2 API supports advanced filtering using AIP-160 format:
query = 'crossplane'
- Text searchfamily = 'upbound/provider-aws'
- Family repositorypackageType = 'provider'
- Package typeaccountName = 'upbound'
- Account namepublic = true
- Public packages onlytier = 'official'
- Official tier packages
type = 'provider'
- Repository typename = 'my-repo'
- Repository namepublic = true
- Public repositoriespolicy = 'publish'
- Repository policycreation_date > '2023-01-01'
- Created after date
(accountName = 'upbound' OR accountName = 'crossplane') AND public = true AND tier = 'official'
Find packages for specific cloud providers or use cases:
Search for "AWS S3" packages to find providers and configurations for S3 resources.
Get examples and CRDs for building compositions:
1. Search for provider packages
2. Get package metadata to see available CRDs
3. Get examples to understand usage patterns
4. Use CRDs and examples to build compositions
Analyze package dependencies and compatibility:
1. Get package metadata for dependency information
2. Check available versions
3. Review documentation and examples
Browse and manage organization repositories:
1. Ensure UP CLI is authenticated (up login)
2. List repositories with filtering
3. Get detailed repository information
The server automatically detects and loads UP CLI configuration from the following locations:
/mcp/.up/config.json
(when running in Docker with mounted config)~/.up/config.json
(default UP CLI location)
No additional configuration is required if UP CLI is properly set up and authenticated.
Note, the marketplace-mcp-server does still need authentication as described in the above section. In order to fulfill that need, you should provide a secret with the contents of the ~/.up/config.json.
For example:
kubectl -n crossplane-system create secret generic up-config --from-file=config.json=path/to/up/config.json
- Go 1.23 or later (required by mcp-go framework)
- Docker (for containerization)
Stdio Transport (for MCP clients like Cursor):
# Run the built binary directly
./mcp-server
# Or run with Docker
docker run -i --rm -v ~/.up:/mcp/.up:ro marketplace-mcp-server:latest
HTTP Transport (for web applications and REST clients):
# Run the HTTP server
./mcp-http
# Or run with Docker
docker run --rm -p 8765:8765 -v ~/.up:/mcp/.up:ro marketplace-mcp-server-http:latest
go test ./...
The server is built using the mcp-go framework, which provides:
- JSON-RPC 2.0 Compliance: Full adherence to MCP protocol specifications
- Multiple Transports: Built-in support for stdio, HTTP, and SSE transports
- Type Safety: Strongly typed request/response handling
- Middleware Support: Extensible architecture for authentication and logging
- Error Handling: Robust error handling with proper MCP error codes
- Server: Main MCP server using mcp-go framework
- Handlers: Tool handlers for marketplace operations
- Auth Manager: UP CLI authentication integration
- Marketplace Client: HTTP client for Upbound Marketplace API
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
For issues and questions:
- Create an issue on GitHub
- Contact the maintainers
{
"name": "search_packages",
"arguments": {
"query": "aws",
"package_type": "provider",
"tier": "official"
}
}
{
"name": "get_package_assets",
"arguments": {
"account": "upbound",
"repository": "provider-aws",
"version": "latest",
"asset_type": "docs"
}
}
{
"name": "get_repositories",
"arguments": {
"account": "crossplane-contrib",
"filter": "type = 'configuration' AND public = true"
}
}