MCC — Model Context Catalog
An MCP server that exposes Python functions and shell commands as a permission-controlled tool catalog. Claude and other LLM clients discover and call tools through a unified search / execute interface, with RBAC and pluggable authentication built in.
Features
- Serve multiple tools from one MCP by exposing Python functions or shell/exec commands
- Published catalog of tools for easy discoverability and llm execution
- Built in RBAC with user management and tool groups
- Multiple auth backends (dev unauthed, Github OAuth2, PAT)
- Optional contrib toolsets (utils and OSINT) loaded via
MCC_SETTINGS_FILES - CLI management of users and tools
- Async tool support
How it works
Tools are defined in YAML files pointing at Python callables. MCC loads them, enforces per-user permissions, and serves them to any LLM via MCP.
Claude → search("deploy") → ["myteam.deploy - Deploys the app execute(environment: str = 'dev')"]
Claude → execute("myteam.deploy", {"environment": "prod"}) → result
Quickstart
uv add model-context-catalog
1. Configure auth (settings.local.yaml):
auth: dev-admin # dev mode: no auth
2. Add an admin user:
mcc user add -u alice -e alice@example.com -g admin
3. Run the server:
python -m mcc.app
4. Point your MCP client at the HTTP endpoint.
Defining Tools
Create a YAML file anywhere:
group: myteam
tools:
- fn: mypackage.mymodule:my_function # required: dotted import path
name: my-tool # optional: defaults to __name__
description: "Does something useful" # optional: defaults to __doc__
params: # optional: introspected from signature
- name: message
type: str # str | int | float | bool | list | dict
required: true
- name: flag
type: bool
override: true # always injected at call time, hidden from callers
Exec Tools (External Commands)
Run any command — Node, Go, shell scripts — as a catalog tool:
tools:
# Interpolation mode (default): params formatted into command string
- name: grep
exec: "grep -rn {pattern} {path}"
params:
- name: pattern
type: str
required: true
- name: path
type: str
default: "."
# Stdin mode: params sent as JSON on stdin
- name: lint
exec: "node tools/lint.js"
stdin: true
timeout: 30
params:
- name: file
type: str
required: true
# With resource limits (unix only)
- name: sandbox
exec: "python3 untrusted.py"
stdin: true
timeout: 10
limits:
mem_mb: 256
cpu_sec: 5
fsize_mb: 50
nofile: 128
Exec tools always return (returncode, stdout, stderr). Params must be declared in YAML (no signature to introspect).
⚠ Security: With
stdin: false(the default), parameters are interpolated directly into the shell command. Do not expose exec tools with user-controlled params to untrusted callers without additional input validation.
Register it in settings.local.yaml:
tools:
- path/to/mytools.yaml
To load optional contrib toolsets, use MCC_SETTINGS_FILES:
# utils — HTTP, filesystem, shell, text, time, archives
MCC_SETTINGS_FILES=toolsets/contrib/settings.yaml
# OSINT — threat intel, corporate records, geolocation, and more
MCC_SETTINGS_FILES=toolsets/osint/settings.yaml
# both
MCC_SETTINGS_FILES=toolsets/contrib/settings.yaml;toolsets/osint/settings.yaml
Authentication
Switch backends via auth in settings:
| Backend | When to use |
|---|---|
dangerous |
Local dev — no auth, auto-selects first admin user |
github_pat |
Simple deployments — use a GitHub PAT for identity |
github_oauth |
Production — full OAuth2 flow via GitHub |
GitHub PAT config:
default:
auth: "github_pat"
github_pat:
token: "ghp_..."
GitHub OAuth config:
default:
auth: "github_oauth"
github_oauth:
client_id: "..."
client_secret: "..."
base_url: "https://your-server.example.com"
User & Permission Management
mcc user add -u alice -e alice@example.com -g myteam
mcc user add -u bob -g admin
mcc user list
mcc user grant alice -g ops -t custom.tool
mcc user revoke alice -t custom.tool
mcc user remove alice
Permission hierarchy (first match wins):
- Tool is in the
publicgroup → anyone can access - User is in the
admingroup → can access everything - User's groups include the tool's group → allowed
- Tool key is in the user's explicit tool grants → allowed
Documentation
- Getting Started — installation, quickstart, configuration
- Tools — YAML format, Python tools, exec tools, parameters, resource limits
- Auth & Permissions — backends, users, groups
- Contrib Toolsets — utils (HTTP, filesystem, shell, text, time, archives) and OSINT (threat intel, corporate records, geolocation, and more)
See openspec/project.md for a full architectural breakdown.
Inspiration How to build an enterprise-grade MCP registry
Metadata
Release files for model-context-catalog 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| model_context_catalog-0.4.0.tar.gz | 68.3 kB | With provenance | Details for model_context_catalog-0.4.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| model_context_catalog-0.4.0-py3-none-any.whl | Python 3 | none | any | Details for model_context_catalog-0.4.0-py3-none-any.whl |
Total release size: 123.0 kB
Release files / model_context_catalog-0.4.0.tar.gz
| Download URL | model_context_catalog-0.4.0.tar.gz |
|---|---|
| Size | 68.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c34262670358e62d99f1a78006e37f57a20e6dd1b3a18bede051fef48c1a71e3
|
|
BLAKE2b-256 checksum How to use checksums |
ff5d8c6b7af69f21cc855917641ed2490b687e7f430f4365b5923d604b1d435c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 13, 2026.
Transparency logRelease files / model_context_catalog-0.4.0-py3-none-any.whl
| Download URL | model_context_catalog-0.4.0-py3-none-any.whl |
|---|---|
| Size | 54.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d167e16ad4a9b6273d95a66400da4822455ac65cee0c6c32ad2fefbfa84998f8
|
|
BLAKE2b-256 checksum How to use checksums |
e7ce153f2c9bfddd0ce2f1450f39b9ce7a1c27e0bd28529e0e0fe50e882c7a24
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 13, 2026.
Transparency logSecurity for model-context-catalog 0.4.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for model_context_catalog-0.4.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 13, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.