From platform
Uploads files as ClosedLoop artifacts (PRDs, implementation plans, templates) via Python script or MCP fallback without consuming conversation context. Supports project selection and new versions.
npx claudepluginhub closedloop-ai/claude-plugins --plugin platformThis skill is limited to using the following tools:
Upload file content as a ClosedLoop MCP artifact. Two modes:
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Generates original PNG/PDF visual art via design philosophy manifestos for posters, graphics, and static designs on user request.
Upload file content as a ClosedLoop MCP artifact. Two modes:
Script mode (preferred) — uses a standalone Python script that reads the
file and calls MCP directly over Streamable HTTP. No conversation context
consumed for file content. Requires a CLOSEDLOOP_API_KEY in .env.local.
MCP fallback — reads the file into context and calls mcp__closedloop__create-artifact
directly. Uses Claude Code's existing MCP auth. Used when no API key is available.
Follow these steps in order:
Read .env.local and look for:
CLOSEDLOOP_API_KEY — the API key (starts with sk_live_)NEXT_PUBLIC_MCP_SERVER_URL — the MCP server URLIf both exist → use script mode (Steps 2a–5a). If API key is missing → use MCP fallback (Steps 2b–5b).
Run the script with --list-projects:
uv run --with 'mcp[cli]' <base_directory>/scripts/upload_artifact.py \
--url <MCP_URL> \
--api-key <API_KEY> \
--list-projects
Parse the JSON output. Extract the items array. Each item has id and name.
Use AskUserQuestion to present the projects to the user:
If only one project exists, skip the question and use it automatically.
Use AskUserQuestion to collect any parameters the user hasn't already specified:
Only ask for parameters the user hasn't already specified. For example, if they said "upload /tmp/my-prd.txt as a PRD", you already have the file path and type — only ask for the title.
uv run --with 'mcp[cli]' <base_directory>/scripts/upload_artifact.py \
--url <MCP_URL> \
--api-key <API_KEY> \
--file <FILE_PATH> \
--title "<TITLE>" \
--type <TYPE> \
--project-id <PROJECT_ID>
Add --verify if the user requested verification or if testing limits.
Add --artifact-id <ID> instead of --title/--type/--project-id when
creating a new version of an existing artifact.
Parse the JSON output and report to the user:
--verify was used)Call mcp__closedloop__list-projects to get available projects.
Use AskUserQuestion to let the user pick a project (skip if only one).
Same as Step 3a — use AskUserQuestion for any missing file_path, title, or type.
Read the file content with the Read tool, then call:
mcp__closedloop__create-artifact for new artifacts (pass title, type,
content, and projectId)mcp__closedloop__create-artifact-version for new versions (pass artifactId
and content)Note: the file content will be loaded into conversation context in this mode.
Report the artifact ID and confirmation from the MCP tool response.
| Flag | Required | Description |
|---|---|---|
--url | No | MCP server URL (default: http://localhost:3010/mcp) |
--api-key | Yes | ClosedLoop API key (sk_live_...) |
--list-projects | No | List projects and exit |
--file | Upload | Path to content file |
--title | Create | Artifact title |
--type | Create | PRD, IMPLEMENTATION_PLAN, or TEMPLATE |
--project-id | No | Project association |
--workstream-id | No | Workstream association |
--artifact-id | Version | Existing artifact ID for new version |
--verify | No | Fetch back after upload and compare lengths |