Pick your client
Every client gets the same tools. Setup differs because slide bytes travel from the client to storage, and some clients restrict outbound network access.Claude Code and the Strand AI SDK
Claude Code runs on your own machine, so it can send slide bytes to storage without extra configuration./mcp in Claude Code, authorize with your Strand AI account, and pick the
organization this connection may act on. The authorized session supports
upload, inference, and result access.
The Python SDK and REST API connect directly
without an MCP connector. Use them for scripted or bulk uploads.
Claude web and desktop apps
These steps cover claude.ai in a browser and the Claude desktop app.1
Add the connector
In Claude, add a custom connector with the server URL
https://mcp.strandai.com/mcp over the Streamable HTTP transport.2
Authorize with Strand AI
Claude opens Strand AI’s sign-in and consent screen. Sign in with your Strand AI
account and approve the requested scopes.
3
Choose an organization
Pick the Strand AI organization this connection may act on. The connection is
bound to that organization and to your user, and runs are billed to that
organization’s credits.
4
Allow uploads to reach storage (upload prerequisite)
Before your first upload, open your organization’s Settings, Capabilities,
Allow network egress, and add
storage.googleapis.com. This setting applies
to the organization, so an administrator must change it on team and
enterprise plans. Start a new chat after changing the setting. An open
conversation retains its original sandbox configuration.Claude sends slide bytes to storage from its sandbox. Until the host is
allowed, uploads fail with host_not_allowed; the other tools continue to
work. The setting is required once per organization. Claude Code and the
Strand AI SDK run on your machine and do not require it.Why storage.googleapis.com is required. Slides are sent directly from
the client to the Google Cloud Storage bucket for your organization’s data.
The bytes are not sent through the model or MCP server. Each presigned
session is restricted to one object in your organization’s storage and
cannot be redirected.Authorization
The connector uses OAuth 2.1 with PKCE. A connection is scoped to one organization and acts as you. Strand AI re-checks your grant, scopes, organization membership, and object ownership on every request, and uses short-lived access tokens throughout. You can review or revoke a connection at any time from Settings, Connected Apps in the Strand AI dashboard. Revoking takes effect immediately.Remote file transfer
Slide bytes are not sent to Claude or to the MCP server:- Upload:
upload_slidereturns a presigned, resumable upload session (an upload id, upload URL, and structured transfer/network/processing metadata) bound to your organization’s storage. A client that can make HTTP requests sends the slide bytes directly to that URL. GCS starts ingest preprocessing automatically when GCS commits the final PUT. Usesubmit_runwithdry_run: truefor the retryable readiness check. Automated de-identification is off by default and runs during ingest only when enabled for your organization. Clients with a restricted sandbox must allow the upload host,storage.googleapis.com. For a multi-GB slide, or to avoid the egress step entirely, upload in your browser at app.strandai.com/samples/upload instead. Browser upload runs independently from MCP upload sessions. Discover its resulting owned sample withlist_samplesorget_sample. For scripted or bulk uploads, use the Python SDK or REST API, which stream slides for you. - Download:
download_resultstakes the format you want.ome-zarrreturns links to the stored result without conversion, so it is ready as soon as the job completes.ome-zarr-zipandome-tiffare generated on demand: the first call starts the export and reportspendingorrunning, and repeating the call polls it until a short-lived signed link appears. A large slide can take several minutes to render. You retrieve the bytes from storage yourself. They are not sent through Claude or the MCP server.
Available tools
Read-only tools can run without a per-call prompt. Tools that write or spend ask you to confirm in Claude.list_samples defaults to active, non-trashed samples owned by the selected
organization. It can instead list the curated public cohort or combine both,
with owned items first and deduplicated. Every item has a canonical id and an
ownership discriminator. get_sample accepts either kind of ID; owned detail
includes current and historical jobs, while public detail contains only curated
public fields. Reads do not spend credits.
Sample results include a canonical absolute app_url. Use this value instead
of constructing a URL from the sample ID.
patch_sample replaces the complete requested name, tag set, or isotropic MPP
calibration. segment_sample starts or retries cell segmentation on an owned,
ready sample. It reserves no credits, reuses completed or in-flight work, and
leaves public samples untouched. submit_run with dry_run: true creates no
job and reserves no credits. Without that flag it reserves credits and starts
inference.
wait_for_job waits for at most 240 seconds. Completed, partially failed,
failed, and cancelled jobs return ordinary status results; a timeout leaves a
longer job running and returns its refreshed latest status so Claude can wait
again.
Example prompts
- Upload my de-identified H&E slide to Strand AI, dry-run a CD3e, CD8, and Ki67 prediction, show me the credit estimate, and ask before submitting it.
- Read sample
SAMPLE_IDand summarize its job history. If jobJOB_IDis still running, wait for its latest status, then give me the OME-Zarr ZIP download link. - Update sample
SAMPLE_IDto 0.5 microns per pixel and tagscohort-aandsite-2, then dry-run CD4 and FOXP3 before asking me to submit.
Troubleshooting
- Upload fails with
host_not_allowed: on claude.ai, addstorage.googleapis.comunder your organization’s Settings, Capabilities, Allow network egress, then start a new chat and retry. An already-open conversation keeps the sandbox it started with, so the change does not reach it. The upload session stays valid. - Authorization fails: reconnect Strand AI and select an organization where your account is still a member.
- Your existing connector shows the wrong scopes or permissions: delete the connector and add it again. Reconnecting reuses the registration Claude already holds, so only removing the connector forces a fresh one.
- Upload remains
not_ready: keep the returnedupload_idand retrysubmit_runwithdry_run: trueafter its suggested interval. If the upload reportsupload_failed, create a newupload_slidesession and re-send the complete file. The Python SDK handles this readiness wait for you. - Insufficient credits on submit: choose a funded organization, or ask its Strand AI administrator to add credits.
- Result link expired: ask Claude to run
download_resultsagain with the same format. Signed links are short-lived. The server reuses a cached export instead of rendering it again. - An export stays
pendingorrunning:ome-zarr-zipandome-tiffare rendered on demand and a large slide takes minutes. Ask Claude to check again. For the fastest path, requestome-zarr, which does not require conversion.