Remote MCP server
ProductivityConnect Claude to Ploxs
Create and edit designed Google Slides decks from content, HTML, or a brand style. Toolspoke puts 20 of its actions behind one MCP endpoint that Claude, Cursor, and Codex all speak.
- Connection
- Remote MCP server
- Authentication
- API key
- Actions exposed
- 20
- Cost per call (typical)
- 1 credit
- Adapter
- Maintained by Toolspoke
Connected in three steps
- 1
Install Ploxs
Open the marketplace in your workspace, add Ploxs to the project your agents work in, and it appears on the gateway immediately.
- 2
Connect the credential
Authenticate with api key. Where to get one, and what it has to be able to reach, is the next section.
- 3
Point your agent at the gateway
Give your client one address, https://toolspoke.com/mcp. Claude Code takes it as a command, Claude and Claude Desktop add it as a custom connector, and Cursor, Codex and VS Code each read it from a config file of their own.
.mcp.json{
"mcpServers": {
"toolspoke": {
"type": "http",
"url": "https://toolspoke.com/mcp"
}
}
}One block covers every tool you have installed. Ploxs shows up in the client as soon as your policy allows it, and so does everything else you install later.
Where the address goes, per client
- Claude Code
Run it in your project, then /mcp to sign in
claude mcp add --transport http toolspoke https://toolspoke.com/mcp- Claude and Claude Desktop
Settings, then Connectors, then Add custom connector
https://toolspoke.com/mcp- Cursor
~/.cursor/mcp.json, or .cursor/mcp.json for one project
{ "mcpServers": { "toolspoke": { "url": "https://toolspoke.com/mcp" } } }- Codex
~/.codex/config.toml
[mcp_servers.toolspoke] url = "https://toolspoke.com/mcp"- VS Code
.vscode/mcp.json, or the MCP: Add Server command
{ "servers": { "toolspoke": { "type": "http", "url": "https://toolspoke.com/mcp" } } }
What Ploxs asks for
API key. You provide it once, when you install the connector. Toolspoke encrypts it at rest and decrypts it only for the length of a single call, and the gateway attaches it to the outbound request itself, so it is never part of the arguments an agent sends.
- Ploxs API keyRequired
- ploxs.com → https://ploxs.com/mcp/setup → create an API key. The key carries the Google Drive connection the decks are written to.
- plx_live_…
What Claude can do in Ploxs
20 actions, each one declared and named by the connector rather than discovered at runtime. A workspace policy grants a person all of them, a hand-picked selection, everything on the read side, everything on the write side, or none.
- Reads
- 11Reads
- Writes
- 9Writes
- Destructive
- 0Destructive
Reads
11Fetches data and changes nothing.
get_account_statusCheck Google Drive connection, entitlements, and the account's initialCreationMode before starting any new deck. Call this first: 'native' means author the slides yourself and convert them with create_presentation_from_html, 'ploxs' means let Ploxs write and design with create_presentation, and 'ask' means ask the user which creator to use and pass their answer as creator_choice.
list_presentationsFind connected Google Slides decks and return reusable deckRefs. Use only when the user names an earlier deck and neither its deckRef nor its creation jobId is already known - edit tools accept a jobId from the same conversation directly.
get_presentation_outlineRead a deck's live numbered slides with text summaries. Slide numbers are 1-based. Call this before targeting a slide for editing so the number you pass is the one you mean.
list_style_configsList styles available to the account: manually saved, extracted from brand files, and used by recent decks. Names are labels rather than visual proof, so inspect a config before using its id, and only for a style the user actually selected. Otherwise skip this and craft an inline style_config.
validate_style_configDiagnose a style configuration after a config error, or when the user asks to inspect one. The creation tools already validate a style before queueing, so this is not a routine preflight step.
get_html_frame_specFetch the native authoring contract: composition patterns, converter-safe CSS, the icon mandate, the Chart.js protocol, and two worked frames marking the density range. Call once, then author every final frame and submit them in a single create_presentation_from_html call. Keep the returned styleRef and pass it to that tool rather than re-sending the style config.
get_presentation_image_upload_statusCheck whether every requested image for an upload session has arrived, and read each one's source pixel dimensions. Only pass the sessionId onward once this reports ready.
wait_for_presentationWait for a queued deck build and return the final Google Slides edit and view links. Call immediately after either creation tool returns a jobId. timedOut true means the deck is still building, not failed - call again with the same jobId.
get_presentation_statusRead a deck job's stage, progress, errors, deckRef, and final Google Slides links. Interchangeable with wait_for_presentation. timedOut true means still building - call again. Pass timeout_seconds 0 for an immediate snapshot.
get_presentation_edit_statusRead progress, results, partial batch results, or errors for a slide edit or batch update task.
wait_for_presentation_editWait for a slide edit or batch update to finish or fail. timedOut true means still running, not failed - call again with the same task_id.
Writes
9Creates or updates something on the other side.
prepare_presentation_image_uploadCreate one upload link for image attachments the user has supplied, passing each exact filename once. Returns a sessionId to poll with get_presentation_image_upload_status and then pass as asset_session_id to whichever creation tool is used.
create_presentationLet Ploxs write and design one new deck from content. Only for initial creation, and only when get_account_status reports initialCreationMode 'ploxs', or 'ask' and the user chose Ploxs. Returns a jobId to poll with wait_for_presentation. Edit an existing deck through its deckRef instead.
create_presentation_from_htmlConvert a complete array of authored HTML frames into one new Google Slides deck, exactly as written. Only for initial creation, and only when get_account_status reports 'native', or 'ask' and the user chose native. Validation is built in, so submit the final frames once. Prefer passing the styleRef from get_html_frame_spec over retyping the style config. Returns a jobId to poll with wait_for_presentation.
connect_presentationSelect an existing Google Slides deck for agent edits. Already-connected decks are ready immediately; a new one needs a Ploxs style and may return a short-lived Google Picker link for exact-file authorization.
add_slidesGenerate and insert new slides into an existing deck using its established Ploxs style.
edit_slideRewrite or redesign one numbered slide. The edit replaces that slide while keeping its position and the deck's style. Read get_presentation_outline first so the slide number is the intended one.
add_image_to_slideGenerate an image and add it to a numbered slide. By default Ploxs redesigns the composition around the image and preserves existing pictures.
add_infographic_to_slideGenerate a chart or infographic and add it to a numbered slide. By default Ploxs redesigns the composition and preserves existing charts.
update_presentationQueue an ordered batch of slide edits, images, infographics, and added slides against one deck. Each slide number resolves against the deck as it exists at that step, and the batch stops at the first failure and reports what completed.
What it will not do
Enforced by the gateway rather than left to convention, which is why each of these can be stated flatly.
- It cannot call anything else
- The 20 actions above are the whole of it. A call to any other name is refused before it reaches Ploxs rather than forwarded on, and connecting your account does not add to the list: it is fixed by the connector, not discovered at run time.
- Nothing here deletes
- This connector writes to Ploxs, but nothing in it deletes or permanently alters anything.
- It reaches no further than your credential
- Toolspoke holds no access to Ploxs of its own. Every call carries the credential you stored and nothing besides, so whatever that credential cannot reach, this connector cannot reach either.
- It never hears from Ploxs
- Nothing is pushed to it. There is no webhook, no subscription and no polling, so this connector cannot notice by itself that something changed in Ploxs. An agent has to ask.
- It does not smooth over provider limits
- Toolspoke does not retry, queue or back off around Ploxs's own rate limits. A call that Ploxs refuses comes back to the agent as a failed call.
Using Ploxs with an agent
Written by whoever built this connector. Agents read the same text on demand through read_guide, so what is below is what they see.
Through Toolspoke every tool below is called with use_tool, passing the name as it appears in search_tools results (ploxs__get_account_status and so on). The workflow and the argument names are otherwise exactly as written here.
Ploxs Presentations
Production server ploxs at https://ploxs.com/mcp.
Deck checklist
Every new deck runs these in order. Never skip one, never claim a step you did not run. Tool results name the next step by number - trust that over your memory of this page.
- `get_account_status` - obey
mcp.initialCreationMode(see below). - Chat image attachments - `prepare_presentation_image_upload` once, hand the user
the uploadUrl, then `get_presentation_image_upload_status` until ready.
- Style - one saved style the user picked, or one complete inline
style_config. - Create once, passing
creator_choice- `create_presentation` (ploxs), or
`get_html_frame_spec` then `create_presentation_from_html` (native). Keep the returned jobId and statusUrl.
- `wait_for_presentation` with that
jobId; if the client exposes only the compatible
`get_presentation_status` name, use it instead. Each call waits ~45s; timedOut: true means still building, not failed - call the same tool again immediately, as many times as it takes.
- Finish with the full Google Slides edit and view URLs on separate lines. If you never
got them, give the user the statusUrl. Never ask the user for a link.
Start
- Call `get_account_status` before every initial deck. If
google.driveConnected is false, give the user links.googleDrive / links.settings and wait. Credit or entitlement errors block Ploxs generation and AI edits, but never block credit-free native HTML-frame creation.
- Obey
mcp.initialCreationMode:
| Mode | Required behavior |
|---|---|
ask | Always ask: “Should Ploxs create and design it, or should I create it natively and use Ploxs only to convert it?” Ask even when the request appears to choose a path, then pass the answer as creator_choice. Both creation tools refuse an ask-mode call without it, so nothing is saved by skipping the question. |
ploxs | Use create_presentation; never author initial HTML frames. |
native (default) | Author the initial slides and use create_presentation_from_html; never call create_presentation. |
These modes apply only to initial creation. Existing-deck edits always use the edit tools.
- If the topic itself is missing, ask one short topic question before spending a job.
Creation returns a jobId and a statusUrl; edits return a task. Wait for completion before a dependent action or a completion claim. Keep the jobId: later outline/edit tools accept it directly as deck_ref, so a same-chat edit never requires the user to paste the Slides URL.
The presentation is the deliverable. Keep chat to required questions/actions, terse status updates, and final links unless the user asks for explanation. Do not narrate reasoning, write a prose slide plan, explain design choices, or print frame HTML before submitting it.
Chat image attachments
For chat image attachments, call `prepare_presentation_image_upload` with their exact unique filenames, give its single uploadUrl to the user, and wait until `get_presentation_image_upload_status` returns ready; the user may upload them in several selections from different folders. Pass the sessionId as asset_session_id to either creation tool. Native frames reference returned ids with <img data-ploxs-image-id="presentation_image_N">. Do not add descriptions or mapping.
Choose a style
Use exactly one style source per call.
- Call `list_style_configs` only when the user refers to a saved, uploaded, or recent
deck style. Read the full config; a matching name does not prove its palette or design. Ask if several match or the config conflicts with the request.
- Otherwise pass a complete inline `style_config`:
style, all seven
colorPalette roles, and typographyConfig. Put persistent rules in brandGuidelines and personality in customStyleDirective.
- Let the destination tool validate the style before queueing. Use
`validate_style_config` only to diagnose a reported config problem or when the user explicitly requests validation; do not duplicate routine config payloads.
- Use `auto_style: true` only when the user gives no usable direction. Never combine
style sources.
Ploxs creation
Call `create_presentation` once with the source material (markdown, urls, file_texts, csv_sources), optional asset_session_id, instructions / slide_count, and one style source. It creates a new Google Slides file.
Then use the completion tool from checklist step 5 with the jobId. If timedOut is true, call the same tool again with the same jobId. Keep the completed deckRef.
Native creation
- Call `get_html_frame_spec` once with the chosen style. Leave
include_chart_spec
at its default (true) - the chart plumbing is unguessable, so a deck that discovers mid-author that a slide compares quantities cannot add one without it. Pass false only for a deck you know carries no quantitative data. Keep the returned `styleRef`.
- Treat HTML/CSS as the planning medium. Read the structured stage, palette, typography,
briefs, contract, overlays, patterns.catalog, techniques, the two worked examples, and any requested chart protocol, then compose every final frame directly. Do not first translate the deck into prose; do not create a prototype, sample, validation slide, outline, or design memo; do not spend one turn per slide. The two examples bracket the density range rather than sampling it - a bare typographic statement at the floor, a full command dashboard at the ceiling. Build between them from patterns.catalog: never reuse example copy or numbers, and never repeat one layout throughout the deck.
- Put the finished HTML directly in the complete
framesarray and send it to
`create_presentation_from_html` once, passing style_ref (the styleRef from step 1), any ready asset_session_id, and a plain-text title. Never retype the style config on this call: a single missing palette key rejects the entire authored deck, which is the most expensive way this flow can fail. Creation performs converter validation before queueing, and invalid frames consume no job. Do not emit the HTML in chat or an intermediate document, and never repeat the large frame payload through a separate validation call.
- If creation returns
invalid_html_frames, repair only the named final frames and
resubmit. Otherwise use the completion tool from checklist step 5 with its jobId; repeat only if timedOut is true, then keep the deckRef.
Frames convert exactly as authored. Follow the returned contract literally, especially:
- one fixed 1280×720 frame per slide with one top-level element and inline CSS; the root
explicitly owns that full canvas and authors every inset/alignment itself because Ploxs adds no margins, centering, scaling, or repositioning to native frames
- no
font-familydeclarations except deliberate monospace; deck fonts already apply - use the whole style as one design system while varying composition by message
- use only supplied numbers and label estimates, projections, and dates on-slide
- use the icon library -
icons.mandateresolves__ICON_<keywords>__placeholders to
professional inline SVG from a 200,000+ icon set. Give icons one consistent role across the deck (metric tiles, capability rows, step markers). A deck with zero icons has left the cheapest source of visual quality unused; a restrained style uses fewer and larger icons, not none
- **put a real chart on any slide whose point is a comparison, trend, distribution, or
part-of-whole** - copy the returned Chart.js plumbing exactly (unique canvas id, loader, dataset.initialized, animation: false). CSS-drawn bars are decoration, not data, and restating the numbers in prose wastes the slide
- when data is not comparative, use HTML markup so it converts to editable Slides shapes
instead of a flat chart image
techniques.degradeslists editability trades, not quality warnings - gradients,
pseudo-element decoration, and clipped shapes all render as authored, so do not strip decoration to avoid them
Existing decks
- Use `list_presentations` to find known decks.
- Use `connect_presentation` for another Slides URL/id. If it returns an
actionUrl,
give it to the user and retry only after approval.
- Fetch `get_presentation_outline` before targeting a slide number.
- Use
edit_slide,add_slides,add_image_to_slide, or
add_infographic_to_slide for one change; prefer `update_presentation` for an ordered compound change. Wait with `wait_for_presentation_edit` before dependent edits, and keep no more than three edit tasks active per key.
- Creation tools never update a deck. Calling either again creates a duplicate Drive
file, so edit the live deckRef instead.
When the user wants to change, refresh, or swap an existing image/chart, confirm that it should be replaced and set replace_existing_asset: true (redesign_slide defaults to true); otherwise the asset tools add another one. In a batch, slide numbers resolve against the deck state at that operation.
Errors and handoff
native_mode_preference→ use native HTML creation.ploxs_mode_preference→ use Ploxs creation.google_not_linked/google_scope_upgrade_required→ relay the action link and wait.invalid_html_frames→ repair the reported frames; never retry unchanged.style_config_required/style_choice_conflict/invalid_style_config→ correct
the single style input.
presentation_not_connected→ callconnect_presentation.slide_not_found→ fetch the live outline again.active_job_limit/rate_limited→ wait, then retry.- Entitlement or credit errors from Ploxs generation or edit tools: report the billing
link and wait. Native HTML-frame creation remains credit-free. After the user recharges or usage becomes available, continue in this same chat and retry the original billable tool call with the existing job or deck context.
Never invent a deckRef or slide number. On completion, label the Google Slides edit and view URLs and put each full URL on its own line.
Before you connect it
What can Claude do in Ploxs?
20 named actions: 11 that only read and 9 that write. They include get_account_status, list_presentations and get_presentation_outline. Nothing outside that list is reachable: the connector declares each operation by name rather than proxying whatever an agent asks for.
What credentials does the Ploxs connector need?
API key. The connector asks for ploxs api key. Values are encrypted at rest and attached to the outbound request by the gateway, so they are never part of the arguments an agent sends and never reach the audit log.
Does the Ploxs connector work with Cursor and Codex, or only Claude?
Any client that speaks MCP, and every one of them gets the same 20 actions. There is a single address, https://toolspoke.com/mcp. Claude Code adds it with claude mcp add --transport http, Claude and Claude Desktop take it as a custom connector in settings, Cursor reads it from .cursor/mcp.json, Codex from ~/.codex/config.toml, and VS Code from .vscode/mcp.json. Each of them signs in to the gateway itself, so there is no key to paste.
What does the Ploxs connector not do?
The 20 actions above are the whole of it. A call to any other name is refused before it reaches Ploxs rather than forwarded on, and connecting your account does not add to the list: it is fixed by the connector, not discovered at run time. This connector writes to Ploxs, but nothing in it deletes or permanently alters anything. Toolspoke holds no access to Ploxs of its own. Every call carries the credential you stored and nothing besides, so whatever that credential cannot reach, this connector cannot reach either. Nothing is pushed to it. There is no webhook, no subscription and no polling, so this connector cannot notice by itself that something changed in Ploxs. An agent has to ask. Toolspoke does not retry, queue or back off around Ploxs's own rate limits. A call that Ploxs refuses comes back to the agent as a failed call.
Can I limit which actions an agent can call?
Yes, in two places. The project switches Ploxs's actions on and off one at a time, for everyone in the project at once, and the screen groups them by read, write and destructive so turning off everything that deletes is one click. An individual agent key can then be narrowed further, to particular toolkits in a project and to particular actions in a toolkit. Whatever it was granted, a key never reaches a project its owner cannot.
What gets recorded when an agent calls Ploxs?
Every attempt, with the agent that made it and the person that agent belongs to, the full request payload, the response payload, the status, the duration, and the credits spent. Values whose key names a secret are masked out before the record is shown to anyone. An operation the connector marks as not retained never has its response body written at all, so the gateway keeps no second copy of what was read.