Install Jentic One Beta
Jentic One is a self-hosted execution layer for AI agents. It lets your agent call the Pulp 3 API, or any other public or private API you need. You set the rules, the agent never sees your credentials, and every call is logged.
Two steps, two machines. Install the instance in a safe environment, then register your agent from wherever it runs.
Step 1: Jentic One Host machine
# On the machine that will host your Jentic One instance:
curl -fsSL "https://jentic.com/install.sh?src=apis&api=%2Fapis%2Fredhat.com%2Fpulp-3" | shStep 2: Agent machine
# On the machine where your agent runs (keep this separate from the instance):
curl -fsSL "https://jentic.com/install.sh?src=apis&api=%2Fapis%2Fredhat.com%2Fpulp-3" | sh
jentic register # connects your agent to your Jentic One instanceJentic One is in public beta. The setup above keeps your agent separate from the instance, which is what you want before using real credentials: an agent running as the same OS user as Jentic One can read its stored keys directly. Just evaluating? A single local install is fine to start. See the secure deployment guide for the tiers.
What an agent can do with Pulp 3 API.
Sync an RPM repository from a remote with mirror and sync_policy options, then follow the returned task
Upload an RPM package as multipart form data and add or remove content units in a repository with modify
Publish a repository version and serve it through a distribution at a chosen base_path
Define remotes with url, policy, TLS certificates, proxy settings, and a rate_limit for upstream downloads
GET STARTED
Search RPM packages by name, arch, version, release, or sha256 using filters such as name__startswith
Inspect or cancel long-running tasks, and clean up orphaned content after removals
Grant roles on a repository, distribution, or remote and list the current user's permissions on it
Patterns agents use Pulp 3 API for, with concrete tasks.
★ Repository maintenance agent through Jentic
A platform agent keeping internal mirrors current needs to trigger syncs and confirm they finished, without a human running pulp CLI commands. Through Jentic the agent searches for 'sync a Pulp RPM repository', loads the sync operation with its input schema, and posts it against the repository href with the chosen remote while the credential is injected at call time. The call returns a task href the agent polls until the task completes, then reports the new repository version.
POST {rpm_rpm_repository_href}sync/ with the remote href and mirror false, then poll GET {task_href} until state reports completed and return the created repository version
Publish a new RPM build
When CI produces an RPM, the release step uploads it, adds it to the repository, and republishes so clients see it. Pulp accepts the package through the RPM upload operation as multipart data, adds content units to a repository through modify, creates a publication from the new repository version, and points a distribution with a name and base_path at that publication.
POST /api/pulp/{pulp_domain}/api/v3/content/rpm/packages/upload/ with the RPM file, POST {rpm_rpm_repository_href}modify/ with add_content_units, then POST /api/pulp/{pulp_domain}/api/v3/publications/rpm/rpm/ for the repository
Package inventory search
Security and release teams need to know which builds of a package are stored. The RPM package list accepts filters such as name, name__startswith, arch, version, release, and sha256, and can be narrowed to a repository_version, so a query can find every stored openssl build for x86_64 or confirm a checksum is present.
GET /api/pulp/{pulp_domain}/api/v3/content/rpm/packages/ with name 'openssl' and arch 'x86_64', then list the version and release of each result
Upstream remote configuration
Mirroring an upstream repository starts with a remote. Creating an RPM remote requires a name and url, and accepts a download policy, TLS client certificates, proxy credentials, timeouts, download_concurrency, and a rate_limit so the mirror does not overload the upstream. A repository created with that remote can then sync on demand.
POST /api/pulp/{pulp_domain}/api/v3/remotes/rpm/rpm/ with name 'baseos-mirror', the upstream url, and policy 'on_demand', then POST /api/pulp/{pulp_domain}/api/v3/repositories/rpm/rpm/ with name 'baseos' and that remote
824 endpoints — the pulp 3 api runs red hat's pulp content platform, which fetches, uploads, organises, and distributes software packages across rpm, container, python, file, npm, maven, ruby gem, and hugging face repositories.
METHOD
PATH
DESCRIPTION
{rpm_rpm_repository_href}sync/
Sync an RPM repository from a remote
/api/pulp/{pulp_domain}/api/v3/repositories/rpm/rpm/
Create an RPM repository
{rpm_rpm_repository_href}modify/
Add or remove repository content
/api/pulp/{pulp_domain}/api/v3/content/rpm/packages/upload/
Upload an RPM package
/api/pulp/{pulp_domain}/api/v3/publications/rpm/rpm/
Create an RPM publication
/api/pulp/{pulp_domain}/api/v3/distributions/rpm/rpm/
Create an RPM distribution
/api/pulp/{pulp_domain}/api/v3/content/rpm/packages/
List RPM packages
{task_href}
Inspect a task
{rpm_rpm_repository_href}sync/
Sync an RPM repository from a remote
/api/pulp/{pulp_domain}/api/v3/repositories/rpm/rpm/
Create an RPM repository
{rpm_rpm_repository_href}modify/
Add or remove repository content
/api/pulp/{pulp_domain}/api/v3/content/rpm/packages/upload/
Upload an RPM package
/api/pulp/{pulp_domain}/api/v3/publications/rpm/rpm/
Create an RPM publication
/api/pulp/{pulp_domain}/api/v3/distributions/rpm/rpm/
Create an RPM distribution
/api/pulp/{pulp_domain}/api/v3/content/rpm/packages/
List RPM packages
What agents get from Jentic-routed access to this vendor.
Setup
Wiring Pulp by hand means choosing between Basic, a sessionid cookie, and OAuth2 client credentials against Red Hat SSO, building href-based URLs for every object, and polling task hrefs for each asynchronous call. Through Jentic you install once, import Pulp 3 from the API Directory, store the credential once, and your agent calls it.
Permission scoping
Pulp places the domain in the path (/api/pulp/{pulp_domain}/...) and addresses each repository, remote, and task by an href that is itself the URL path, so a rule can bound your agent to one domain or one repository's operations. You choose the operations it may call, so destructive ones like repository deletion or orphan cleanup are not included unless you add them.
Credential isolation
Your Pulp credential is stored once, encrypted, by your own Jentic One instance and injected at execution time. It never enters the agent's prompt, logs, or context.
Intent-based discovery
Agents search Jentic by intent such as 'sync a Pulp RPM repository' or 'upload an RPM package', and Jentic returns the matching Pulp operation with its input schema, so the agent finds the right one among hundreds without browsing the reference.
Alternatives and complements available in the Jentic catalogue.
Specific to using Pulp 3 API through Jentic.
What authentication does the Pulp 3 API use?
Per its OpenAPI spec, every operation accepts any one of three schemes: HTTP Basic, a sessionid cookie, or OAuth2 client credentials against Red Hat SSO with the api.console scope. For agent use, Basic or a client-credentials token is the practical choice. Through Jentic the credential is stored by your own instance and attached at call time.
How do I know when a Pulp sync has finished?
Sync, publish, and modify calls return HTTP 202 with a task href rather than finishing inline. Poll GET {task_href} to read the task state and the resources it created, such as the new repository version, and use PATCH {task_href} to cancel a task that should not continue.
What are the rate limits for the Pulp 3 API?
The OpenAPI spec does not specify request rate limits for the API itself. Its rate_limit field applies to remotes, capping how fast Pulp downloads from an upstream. Check the Pulp documentation at https://pulpproject.org for server tuning guidance.
Is there a Pulp MCP server?
You don't need an MCP server to give your agent Pulp. Jentic connects it directly from the API Directory: import it, store your credential once, and your agent finds the sync, upload, and publish operations it needs on demand instead of loading hundreds of tool definitions into its context.
How do I sync an RPM repository through Jentic?
Search Jentic for 'sync a Pulp RPM repository', load the POST {rpm_rpm_repository_href}sync/ operation, and run it with the repository href and a remote href. Then poll the returned task until it completes. To run it on your own infrastructure, install Jentic One from its GitHub repo.
Which content types does this Pulp API cover?
The spec includes repositories for RPM, container, Python, file, npm, Maven, Ruby gem, and Hugging Face content, plus OpenPGP keyrings. Each type has its own remotes, repositories, and in most cases publications and distributions.
Can I limit what my agent is allowed to do with the Pulp 3 API?
Yes. As an example, allow only POST on one repository's sync path and GET on task hrefs, so the agent can refresh that mirror and check progress but cannot delete repositories, remove content, or clean up orphans, and every call is logged.
Know of an official OpenAPI document? Contribute it →
For Agents
Sync RPM, container, Python, and other package repositories from remotes, upload and add packages, publish and distribute repository versions, and track the resulting Pulp tasks.
Use for: Sync our RPM mirror from its upstream remote, Upload a new RPM package and add it to the repository, Publish the latest repository version and update the distribution, Check whether the sync task finished
Not supported: Does not build packages, run CI pipelines, or execute containers. Use for storing, syncing, publishing, and distributing package repositories in Pulp only.
The Pulp 3 API runs Red Hat's Pulp content platform, which fetches, uploads, organises, and distributes software packages across RPM, container, Python, file, npm, Maven, Ruby gem, and Hugging Face repositories. Repositories sync from remotes into immutable repository versions, content is added or removed through modify calls, and publications are served to clients through distributions at a base_path. Long-running work such as a sync returns a task that can be inspected or cancelled, and content guards, roles, signing services, exporters, and importers control access and movement between Pulp instances.
This API is usable in Jentic One now. Its AI-readiness score against Jentic's framework shows where it stands today and where improvements would make it even easier for agents to use.
{task_href}
Inspect a task
Base layer of spec validity and structural soundness.
Aggregated quality score from linter diagnostics, weighted by severity.
Percentage of `$ref` references that resolve successfully.
Checks whether the API description parses successfully and conforms to its declared specification (e.g., OpenAPI).
Structural correctness score based on schema issues using logarithmic dampening.
Clarity, completeness, and ingestion readiness for developers and tooling.
How richly the API is illustrated with examples.
Percentage of examples that conform to their schemas.
Percentage of operations with complete response definitions (success, client error, server error).
Health of API ingestion, bundling, and resolution within Jentic pipelines.
Semantic breadth, depth, and agent comprehension for AI systems.
Coverage of descriptions across API elements.
Coverage of RFC 9457 Problem Details for error responses.
Coverage, uniqueness, and casing consistency of operationIds for AI inference.
Coverage of summaries across operations/tags/info.
Functional utility, complexity comfort, and AI orchestration readiness.
Agent comfort level based on API operational and structural complexity.
Trust, risk posture, and security compliance.
Average quality of security schemes based on authentication method strength (weakest link for OAuth2).
Findability, semantic richness, and reasoning readiness.
Clarity and depth of descriptions across API elements.
Score it yourself
Every API in the directory is allowlisted, so you can re-score it with no key required.
npx @jentic/api-scorecard-cli score <openapi-url>