---
title: "Generic bridge to the full MCP tool catalog"
method: POST
path: "/api/v1/actions/{toolName}"
tags: ["Actions"]
---

# Generic bridge to the full MCP tool catalog

`POST /api/v1/actions/{toolName}`

## Request

- Base URL: `https://app.reachium.io`
- URL: `https://app.reachium.io/api/v1/actions/{toolName}`
- Auth: HTTP bearer

ONE generic endpoint over the entire tool catalog (97 tools) rather than one path per tool. Every tool ALSO has its own literal /api/v1/actions/<toolName> path (see below), each carrying that tool’s real generated request body schema and description. A compact per-tool index (scope, daily cap plus its resolved bucket key, confirm behaviour) is ALSO machine-readable in this SAME document, under the top-level `x-mcp-actions` key, keyed by tool name. The request body is passed through verbatim as that tool’s arguments; a completed tool response is wrapped as `{ data: <tool result> }` under HTTP 200 (billing/cap/confirm outcomes for the called tool are embedded inside `data` by MCP convention, not remapped to HTTP statuses here). Authentication, request-shape, and optional idempotency-protocol failures still use their documented non-200 statuses. Reaching this route only requires the 'read' scope; the CALLED tool’s own required scope is enforced separately: a tool that exists but is out of the key’s reach is a 403, a tool name that does not exist at all is a 404. sendReply via this bridge keeps its two-step preview-then-confirm flow by default, exactly as it works over MCP (which is unconditional). The one exception: a REST key minted with auto_confirm:true executes sendReply on the first call instead, like every other auto-confirm-eligible tool. POST /api/v1/replies is the separate single-call path for that one tool, for callers who do not want either version of the confirm step.

## Path parameters

- `toolName` 'activateCampaign' | 'activateConnectorRule' | 'addSearchToLeadList' | 'approvePost' | 'attachImageToPost' | 'attachResourceToPost' | 'connectLinkedInAccount' | 'createConnectorRule' | 'createDocument' | 'createDraftCampaign' | 'createDraftPost' | 'createLeadList' | 'createLeadMagnetCampaign' | 'createWebhookEndpoint' | 'deleteCampaign' | 'deleteConnectorRule' | 'deleteDocument' | 'deleteDraftCampaign' | 'deleteDraftPost' | 'deleteLeadList' | 'deleteWebhookEndpoint' | 'disableConnectorRule' | 'disconnectConnector' | 'draftPost' | 'finalizeAsset' | 'findLeads' | 'generateCampaignCopy' | 'generateDocument' | 'generateIdeas' | 'generateImage' | 'generatePlan' | 'getAccountCapacity' | 'getAccountLimits' | 'getAccountUsage' | 'getAnalytics' | 'getArtifact' | 'getBillingStatus' | 'getBookings' | 'getBoostingPools' | 'getBrandProfile' | 'getCampaignFunnel' | 'getCampaignLeads' | 'getCampaignSenderAccounts' | 'getCampaignSequence' | 'getCampaignStats' | 'getCampaigns' | 'getConnectorRules' | 'getConnectors' | 'getContent' | 'getConversationMessages' | 'getConversations' | 'getCreditBalance' | 'getDocuments' | 'getDraft' | 'getLeadListSample' | 'getLeadLists' | 'getLeadStats' | 'getLinkedInAccounts' | 'getPlanSlots' | 'getPlaybook' | 'getPost' | 'getReplyQueue' | 'getScheduledPosts' | 'getScrapeJob' | 'getTopPosts' | 'getWebhookEndpoints' | 'getWorkspaceInfo' | 'getWorkspaceStats' | 'importLeads' | 'listAssets' | 'listIcps' | 'manageBoostingPool' | 'manageLeadList' | 'pauseCampaign' | 'rankIdea' | 'removeLeadsFromList' | 'requestUploadUrl' | 'revertPostToDraft' | 'schedulePost' | 'scheduleSlot' | 'searchDatabase' | 'sendMessage' | 'sendReply' | 'startScrape' | 'unschedulePost' | 'updateAccountLimits' | 'updateArtifact' | 'updateBrandProfile' | 'updateCampaign' | 'updateClaim' | 'updateDocument' | 'updateDraftCampaign' | 'updateDraftPost' | 'updateLead' | 'updateWebhookEndpoint' | 'uploadAsset' | 'upsertIcp', required

## Headers

- `Idempotency-Key` string

## Request body

- object: Arbitrary, tool-specific arguments. See the in-app MCP tool catalog for each tool’s shape.

## Response `200`

The called tool’s own result, shape depends on the tool.

- object
  - `data` unknown, required
  - `error` unknown, required

## Other responses

- `400`: The request body was not a JSON object (code invalid_request), or Idempotency-Key is malformed (code invalid_idempotency_key).
- `401`: Missing or invalid API key. Send `Authorization: Bearer rmcp_...` (code unauthorized).
- `403`: This tool exists but is out of the key’s granted scope (code insufficient_scope).
- `404`: No tool by this name exists (code unknown_tool).
- `409`: This Idempotency-Key has an unresolved in-flight or ambiguous result (code request_in_flight). Reconcile before using a new key.
- `422`: This Idempotency-Key was already used with a different request body (code idempotency_key_reuse).
- `429`: Rate limited: shared `mcp:ip:{ip}` (600/60s) or `mcp:key:{keyId}` (120/60s) bucket, the SAME buckets the MCP endpoint uses (code rate_limited).
- `500`: Unhandled server error (code internal_error).

## Changes

- **2026-10-20** `11682826692b`: 3 info
  - added the new enum value `listIcps` to the `path` request parameter `toolName`
  - added the new enum value `updateClaim` to the `path` request parameter `toolName`
  - added the new enum value `upsertIcp` to the `path` request parameter `toolName`

[Operation history](https://skmtc.dev/reachium/apis/reachium-api/changes/api/v1/actions/:toolName/post.md)

---

[API](https://skmtc.dev/reachium/apis/reachium-api.md) · [All operations](https://skmtc.dev/reachium/apis/reachium-api/llms.txt) · [OpenAPI document](https://skmtc.dev/reachium/apis/reachium-api/revisions/30c16b30b499?raw)
