Getting it into your agent
There is no command for this one: it runs only inside a plugin, and the catalogue could not identify which plugin ships it. The source is linked below.
Wrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/azeemkafridi/bulkpublish-api/bulk-publish)<a href="https://agentmods.dev/skills/azeemkafridi/bulkpublish-api/bulk-publish"><img src="https://agentmods.dev/badge/skills/azeemkafridi/bulkpublish-api/bulk-publish/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/azeemkafridi/bulkpublish-api/bulk-publish"><img src="https://agentmods.dev/badge/skills/azeemkafridi/bulkpublish-api/bulk-publish.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00038 | $0.00972 |
| Opus 5 | $0.00019 | $0.00486 |
| Sonnet 5 | $0.00008 | $0.00194 |
| Haiku 4.5 | $0.00004 | $0.00097 |
Grade A, and why
bulk-publish scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 9d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 73 lines — stays where its author put it; the contents beside it link to each section on GitHub.
BulkPublish — Media & Bulk Publishing Reference
upload_media parameters
url (string, optional) — public URL to download from
filePath (string, optional) — absolute local file path (e.g. /Users/me/photo.png)
filename (string, optional) — override filename, otherwise derived from url/path
Provide either url OR filePath, not both.
Supported formats
| Type | Formats | Max size |
|---|---|---|
| Image | JPEG, PNG, WebP, GIF | 100MB |
| Video | MP4, MOV, WebM | 100MB (up to 1GB via multipart — see below) |
Response
Returns: id (use this in mediaFileIds when creating posts), fileName, mimeType, sizeBytes, width, height, duration (video), originalUrl, thumbnailUrl, previewUrl.
Other media tools
| Tool | Use for | Key params |
|---|---|---|
list_media |
Browse uploaded files | search, page, limit |
get_media |
Single file details | mediaId |
delete_media |
Remove a file | mediaId |
Media requirements by platform
| Platform | Image | Video | Notes |
|---|---|---|---|
| Instagram Reels | — | MP4, 9:16 | 3-90 seconds |
| Instagram Stories | JPEG/PNG, 9:16 | MP4, 9:16 | 1080x1920 recommended |
| Instagram Carousel | JPEG/PNG | — | 2-10 images |
| TikTok | — | MP4 | 1-10 minutes |
| YouTube | — | MP4 | Requires title in platformSpecific |
| JPEG/PNG, 2:3 | MP4 | 1000x1500 recommended | |
| Facebook/X/LinkedIn | JPEG/PNG | MP4 | Most formats accepted |
Large files — multipart upload (REST API)
For videos over 100MB (up to 1GB), use the chunked multipart flow. No MCP tool yet — call the REST API directly (Authorization: Bearer bp_your_key, base https://app.bulkpublish.com):
POST /api/media/multipart/create— body{contentType, sizeBytes}(exact size) →{r2Key, uploadId, partSize, partUrls, expiresIn}.partSizeis fixed at 10MB (10485760);partUrlsis one presigned PUT URL per part, in order; URLs expire in 3600s.PUTeach 10MB slice of the file to itspartUrland save theETagresponse header per part. A failed part can be retried alone — a network drop never restarts the whole file.POST /api/media/multipart/complete— body{r2Key, uploadId, parts: [{partNumber, etag}], fileName, mimeType, sizeBytes, width?, height?, duration?}→{file}(same media object as a normal upload; itsidgoes inmediaFileIds). Failed assembly auto-aborts the upload.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 9d ago First seen · 73 lines · 38 tokens per session scan A 51fdc7f5d8cd
bulk-publish is a skill published in the GitHub repository azeemkafridi/bulkpublish-api (1 stars, last pushed 6d ago), licensed MIT. It adds 38 tokens to every session and 972 once invoked, about $0.0002 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
explore-api
Explore an OpenAPI spec's structure using parse and walk tools.
diff-specs
Compare two OpenAPI spec versions, highlight breaking changes, and suggest migration steps.
fix-spec
Auto-fix common OpenAPI spec issues with a preview-first workflow.
generate-code
Generate Go client, server, or type code from an OpenAPI spec.
validate-spec
Validate an OpenAPI spec, explain errors clearly, and suggest or apply fixes.
kui-framework
Guide for building web applications with the Kui framework. Use when writing Kui ASGI/WSGI handlers, defining routes, binding parameters, configuring OpenAPI docs, or working with middleware/dependency injection.