content-mcp — Content MCP server
The official MCP server for the Content engine: give Claude, an IDE or any MCP-compatible agent the ability to drive your Content instance — analyze a URL, generate video/audio/subtitles/transcripts, watch the job, land the files in your library. It is an agentic facade over the official Python SDK: no REST of its own, no business logic.
any MCP client → content-mcp (this) → content_sdk → your Content engine (/api/v1)
Where downloaded files land
download_artifact writes to the machine running this server — the counterpart
to delivery, which writes to the engine's library. One variable bounds it:
| Variable | Default | Role |
|---|---|---|
CONTENT_MCP_DOWNLOAD_DIR |
~/Downloads/Content |
The only directory this server may write to. Relative destinations resolve inside it; anything pointing outside is refused, not clamped |
The refusal is deliberate. An MCP server writes to a real filesystem on an agent's say-so, so widening that is the operator's decision, taken once, rather than something a prompt can talk it into.
Install
The server is an ordinary Python application — nothing to clone:
uv tool install content-mcp # isolated, on your PATH — recommended
content-mcp --help
# or
pipx install content-mcp
content-mcp on PyPI pulls
content-sdk as an ordinary
dependency, pinned to the matching release. The wheels are also attached to
each GitHub release
for air-gapped installs (uv tool install ./content_mcp-<v>-py3-none-any.whl --find-links .).
Connect it to your engine
One environment variable: CONTENT_API_URL (default http://localhost:8010).
The server speaks stdio — your MCP client spawns it; you never run it by hand.
Claude Code
claude mcp add content --env CONTENT_API_URL=http://localhost:8010 -- content-mcp
Claude Desktop, Cursor, and other clients
Claude Desktop (claude_desktop_config.json), Cursor (.cursor/mcp.json) and
any other client using the standard JSON shape:
{
"mcpServers": {
"content": {
"command": "content-mcp",
"env": { "CONTENT_API_URL": "http://localhost:8010" }
}
}
}
Then ask for something like "analyze this YouTube URL and download the audio
into my library" — the expected flow is get_config → analyze_source →
generate → get_job, ending with a delivered_path you can find under the
engine's delivery folder.
Logs go to stderr (stdout carries only the MCP JSON-RPC framing), so a client's log pane shows them without corrupting the session.
Tools (intention-level, not one-per-endpoint)
| Tool | Intent |
|---|---|
analyze_source |
Analyze a URL: what it is + what can be produced |
list_capabilities |
Resolve the capabilities for an analyzed source |
generate |
Start a job producing outputs from an analysis_id; an output spec may carry delivery (mode/folder/filename, ADR 0018) |
get_job |
Job status; once terminal, its artifacts — user-facing names (ADR 0017) and delivered_path in the server library |
cancel_job |
Cooperative cancellation |
list_jobs |
Recent jobs |
get_artifact |
Artifact metadata; small text is inlined, larger/binary returns a download reference (never raw bytes over MCP) |
get_config |
Request-building context: credential ids, whether delivery-by-default is on, the existing library folders |
Resources (read-only, content:// namespace)
content://analyses/{id}, content://jobs/{id}, content://artifacts/{id} —
JSON views for a host to attach as context. Prompts are intentionally not
provided yet.
For development
From a clone:
make install # editable installs of the engine, SDK, CLI and MCP in one venv
claude mcp add content --env CONTENT_API_URL=http://localhost:8010 \
-- apps/backend/.venv/bin/python -m content_mcp.server
Build the distributions with make wheels (they land in dist/).
Verification status
- Service logic over a mock transport: verified (
tests/test_service.py). - The MCP wiring against the real
mcplibrary (tools, resource templates): verified (tests/test_server.py). - The full journey — MCP service → SDK → real FastAPI engine → executor →
delivery library, including
deliveryintent andmode: "none": verified in-process (tests/test_end_to_end.py, inmake validate). - The installed wheel driven over stdio by an MCP client session against a running engine: verified at packaging time (see the repository's release notes); re-run it after any transport change.
Design
service.py— the intention logic; takes an SDK client, returns JSON. No MCP imports, no HTTP. Fully unit-tested over a mock transport.server.py— thin wiring: registers the tools/resources on anMCPServerand runs stdio.content-mcp→content_mcp.server:main.- The layering is enforced by tests: the MCP server may import
content_sdkonly — never an HTTP client, never backend internals (tests/test_layering.pyat the repo root).
Local files, both directions
A path you give analyze_source is a path on the machine running this
server, never on the engine: the file is read here and uploaded, which is the
only way a local file becomes usable by an engine running elsewhere. Identical
path strings on two machines do not imply identical filesystems, so the path is
never passed through untouched.
download_artifact is the mirror image — it brings a finished artifact back to
this machine, bounded by CONTENT_MCP_DOWNLOAD_DIR (see above).
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file content_mcp-0.6.0.tar.gz.
File metadata
- Download URL: content_mcp-0.6.0.tar.gz
- Upload date:
- Size: 23.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0eb8d3333f000eb8f6261f1e1f34041688f5543703f7b3fc69e6b397914e32a0
|
|
| MD5 |
3bb26305d222cd72b5db68d3aed6e49c
|
|
| BLAKE2b-256 |
49067747b8fa6e83c99e5163b6aa4c5e7b97d52534b328eb77692220cbafd6c8
|
Provenance
The following attestation bundles were made for content_mcp-0.6.0.tar.gz:
Publisher:
publish-pypi.yml on LatentNoise/content
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
content_mcp-0.6.0.tar.gz -
Subject digest:
0eb8d3333f000eb8f6261f1e1f34041688f5543703f7b3fc69e6b397914e32a0 - Sigstore transparency entry: 2549733188
- Sigstore integration time:
-
Permalink:
LatentNoise/content@31a5953640dee3e23332b026da3a075368fb1f5f -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/LatentNoise
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@31a5953640dee3e23332b026da3a075368fb1f5f -
Trigger Event:
release
-
Statement type:
File details
Details for the file content_mcp-0.6.0-py3-none-any.whl.
File metadata
- Download URL: content_mcp-0.6.0-py3-none-any.whl
- Upload date:
- Size: 26.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c1784fd3308a8cb45631f7b4ef4e4d5809f91c126013e79580f19d17581200b3
|
|
| MD5 |
5ad6ba1092b4d14b1c1f53cf45ae096c
|
|
| BLAKE2b-256 |
ba6dc32f5808424b287037a2e7ab5541d3ce710c03db342f8cd70b61319c6927
|
Provenance
The following attestation bundles were made for content_mcp-0.6.0-py3-none-any.whl:
Publisher:
publish-pypi.yml on LatentNoise/content
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
content_mcp-0.6.0-py3-none-any.whl -
Subject digest:
c1784fd3308a8cb45631f7b4ef4e4d5809f91c126013e79580f19d17581200b3 - Sigstore transparency entry: 2549734377
- Sigstore integration time:
-
Permalink:
LatentNoise/content@31a5953640dee3e23332b026da3a075368fb1f5f -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/LatentNoise
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@31a5953640dee3e23332b026da3a075368fb1f5f -
Trigger Event:
release
-
Statement type: