Skip to main content
The Strand AI remote MCP server lets Claude operate the Strand AI platform directly. Lattice predicts spatially resolved protein-marker maps from routine H&E, delivered as virtual mIF channels. From a Claude conversation you can upload an H&E whole-slide image, inspect samples, estimate or submit a Lattice job, read its status, and download its predicted channels. Every action is authorized against your existing Strand AI organization. The server is an authenticated layer over the same Strand AI REST API. It exposes tools only, never a database or storage credential, and slide bytes never pass through it (see Remote file transfer).

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.
Run /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 jobs 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. Transfer bytes bypass the conversational model context and MCP transport; Lattice still processes the stored slide to generate predictions. Each presigned session is restricted to one object in your organization’s storage and cannot be redirected.
After this setup, the Claude conversation supports upload, inference, and result access.
For large slides or uploads without an egress setting, use the browser at app.strandai.com/samples/upload. The browser uploader runs on your machine and does not use Claude’s sandbox. This is the recommended path for multi-GB whole-slide images. After upload, use the connector to estimate and submit jobs, then read results.

Authorization

The remote Strand MCP server accepts either an OAuth 2.1 access token or an existing Strand API key in the Authorization: Bearer <credential> header. Claude Code and the Claude web and desktop apps use OAuth 2.1 with PKCE. An OAuth connection is scoped to one organization and acts as you. Strand AI re-checks its grant, scopes, organization membership, and object ownership on every request, and uses short-lived access tokens. Review or revoke an OAuth connection from Settings → Connected Apps. For clients that supply their own bearer credential, create an API key in Settings → API keys. The key is bound to that organization and attributed to the user who created it. It has full authority across all ten MCP tools, including operations that spend the organization’s credits.
A Strand API key can spend your organization’s credits. Store it in a secret manager. Do not put it in source code, logs, browser code, prompts, or shared configuration.
Strand revalidates the key on every MCP introspection and REST request. A key with a configured expiry stops working at that time. Rotate a key by creating a replacement, updating the client, and revoking the old key in Settings → API keys. Revocation takes effect on the next request.

Remote file transfer

Upload and download bytes bypass the conversational model context and MCP transport. Lattice still processes stored slide data to generate predictions:
  • Upload: upload_sample immediately creates the owned sample and a presigned, resumable transfer (an upload id, upload URL, and structured transfer/network/processing metadata) bound to your organization’s storage. The upload id is the sample id used by get_sample and submit_job. 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. Use submit_job with dry_run: true for 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 with list_samples or get_sample. For scripted or bulk uploads, use the Python SDK or REST API, which stream slides for you.
  • Download: download_results takes the format you want. ome-zarr returns links to the stored result without conversion, so it is ready as soon as the job completes. ome-zarr-zip and ome-tiff are generated on demand: the first call starts the export and reports pending or running, 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. include_original_upload: true instead requests the separate stored source file, not processed H&E. The option defaults to false, is runtime-gated, and is currently disabled in production. The source can be multi-GB; if ingest de-identification ran, the stored de-identified copy is returned. Its private bearer URL expires after 15 minutes. Anyone holding it can download the source until expiry, so do not share it.

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 up to its 50 newest jobs plus an uncapped count, while public detail contains only curated public fields. Use get_job for one exact known job of any age. 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. update_sample updates the requested name, unified field values, or isotropic MPP calibration. Field values are keyed by stable key; fields.tags is the complete desired Tags set, not a delta. Public is read-only. 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_job with dry_run: true creates no job and reserves no credits. Without that flag it reserves the estimate and starts inference. Completion settles and debits delivered work, then releases any unused reservation. Eligible cancellation releases the reservation. get_job makes one status request and returns immediately. A nonterminal response does not schedule another check or wake the conversation. Call it again only when you ask or return. Host schedulers may poll outside the model transcript.

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_ID and summarize its job history. Read job JOB_ID; if it is complete, give me the OME-Zarr ZIP download link.
  • Update sample SAMPLE_ID to 0.5 microns per pixel and set fields.tags to cohort-a and site-2, then dry-run CD45 and CD3e before asking me to submit.

Troubleshooting

  • Upload fails with host_not_allowed: on claude.ai, add storage.googleapis.com under 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 returned upload_id and retry submit_job with dry_run: true after its suggested interval. If the upload reports upload_failed, create a new upload_sample session 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_results again with the same format. Signed links are short-lived. The server reuses a cached export instead of rendering it again.
  • An export stays pending or running: ome-zarr-zip and ome-tiff are rendered on demand and a large slide takes minutes. Ask Claude to check again. For the fastest path, request ome-zarr, which does not require conversion.
For unresolved connector issues, email support@strandai.com with the job or sample ID. Do not include slide data or credentials.

Data handling

Research use only (RUO). Not for use in clinical or diagnostic procedures.
Slides must be de-identified before upload. Do not upload protected health information or other regulated health data, and upload only data you are authorized to process. Organization retention settings and your Strand AI agreement govern uploaded data and results. See the Strand AI Privacy Policy and Security and data handling. Report suspected security issues to security@strandai.com.