What it does
Record that a product has been installed into a client. This is the one platform tool that writes, and it is worth being precise about what it does: it appends an installation row so the library, the project and any later run history point at something real. It does not copy files, configure your MCP client, or execute anything.
Arguments
| Name | Type | Required | Meaning |
|---|---|---|---|
| slug | string | yes | Product slug |
| target | string | yes | Where it is installed: claude, cursor, vscode, hosted, download |
| project_id | string | no | Bind the install to one project, so an agent reads that project's context. Omit for workspace-wide. |
| version | string | no | Version installed. Defaults to the catalogue's current version. |
This table is generated from the literal inputSchema that tools/list returns, so what your client sees and what this page says are the same object:
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Product slug"
},
"target": {
"type": "string",
"description": "Where it is installed: claude, cursor, vscode, hosted, download"
},
"project_id": {
"type": "string",
"description": "Bind the install to one project, so an agent reads that project's context. Omit for workspace-wide."
},
"version": {
"type": "string",
"description": "Version installed. Defaults to the catalogue's current version."
}
},
"required": [
"slug",
"target"
]
}Request
Paste this, swap the key, and you have called the tool.
curl -s https://topclozer.com/api/mcp \
-H "Authorization: Bearer tcz_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "install_product",
"arguments": { "slug": "linkedin-starter-agent", "target": "claude" }
}
}'Returns
{ installation, product, note } — the stored row, the product it points at, and one sentence on what has and has not happened.
The payload arrives inside an MCP content block — one text block whose body is this JSON, pretty-printed. Parse the string; there is no structured-content field.
{
"installation": {
"id": "ins_9f3a21",
"org_id": "org_01",
"product_slug": "linkedin-starter-agent",
"project_id": null,
"version": "1.0.0",
"target": "claude",
"status": "active",
"installed_at": 1789084800000,
"removed_at": null
},
"product": { "slug": "linkedin-starter-agent", "name": "LinkedIn Starter Agent", "price": "Free" },
"note": "Recorded. Nothing was executed and no files were written to your machine — the product's files are on its page."
}Worth knowing
Idempotent per (product, target): installing again updates the version and the project binding on the existing active row rather than creating a second one. A priced product cannot be installed until a purchase for it is `paid`; no payment processor is configured on this server, so today that gate refuses every priced product and says exactly why. Free products install normally. A target the product does not ship for is refused and the refusal names the targets it does ship for — a product that declares none is not refused, since silence is not a claim. A project_id that is not this workspace's is refused rather than silently ignored.
Limits
No request limit. This tool reads the workspace database and costs nothing to serve. The limits that bite in this product are the sending controls — per-sender weekly invite caps, the warm-up ramp, the working-hours window and a randomised gap between actions — and no tool can raise them.
Related tools
get_product
One product in full: capabilities, risk, price, and whether this workspace has bought or installed it
list_installations
What this workspace has installed, where, and what it paid for
list_projects
The projects in this workspace, with how complete each one's context is
All 21 tools are listed on the tool index. Connecting a client is on the Claude setup page, and the protocol details are on the server page.