← all notes
blog

Drive Tissue from Claude: the Tissue MCP server.

Tissue now has an MCP server. Point Claude — or Cursor, Windsurf, or any Model Context Protocol client — at one URL and manage your whole account in plain language: deploy Cells, query c3, read and write g7 objects, schedule pulses, and handle secrets, without leaving the chat.

The endpoint is https://tissue.systems/mcp. Everything an agent can see and do is bounded by the token you give it — least privilege, by construction.

For Claude Code, that's the whole setup:

claude mcp add --transport http tissue https://tissue.systems/mcp

On first use it opens your browser, you sign in to Tissue once, and the tools light up — no token to copy, no config file to hand-edit. Under the hood it's a standard OAuth flow with automatic client registration; the same browser-login works in Claude Desktop, Claude.ai, and Cursor. For CI and headless agents, create a scoped tok_… token instead and pass it as a bearer header. Full setup for every client is in the docs.

The server exposes one tool per operation, named <area>_<verb>, and filters them by your token's scopes — a read-only token simply never sees the write or delete tools.

AreaTools
Cellscell_list, cell_get, cell_deploy, cell_invoke, cell_logs, cell_errors, cell_delete
c3 — SQLc3_query (read-only), c3_execute, c3_batch, c3_database_list/create/drop
g7 — storageg7_bucket_*, g7_object_*, g7_presign_upload, g7_presign_download
pulse — cronpulse_list, pulse_trigger
vault — secretsvault_key_list, vault_set, vault_delete
accountwhoami, token_list/create/revoke, search_tissue_docs

Once connected, ask in plain language:

Deploy a Cell called "hello" that returns "Hello, world!" for any request.

Create a c3 database "todos" with a tasks table (id, title, done, created_at),
then show me everything in it.

Show me the last 20 errors from my "payment-processor" Cell.

List my buckets and tell me the total size of the "uploads" bucket.

Claude calls the right tools, chains them, and reports back — deploying, querying, and inspecting as it goes.

Object bytes don't belong in a model's context. For anything beyond small text, the server mints a short-lived presigned URL and the bytes move out-of-band — straight to storage, never through Claude:

You: upload ./logo.png to my "assets" bucket.
Claude → g7_presign_upload → returns a one-time PUT URL
       → curl -T logo.png "<url>"   (bytes go directly to g7)

Because Tissue is the storage layer, the presigned URL is signed and verified by g7 itself — time-boxed, scoped to a single object and method, and tied to your bucket's credentials. The agent gets a capability, not your keys.

Small choices add up to a server that's safe and legible for an LLM to drive:

FeatureWhy it matters
Scoped tokensGrant an agent databases:read and nothing else — enforced at the token, and read queries run on a read-only connection so writes are rejected by the engine.
Tool annotationsEvery tool is tagged read-only / destructive / idempotent, so your client can ask before it deletes.
Structured outputResults come back as machine-readable JSON, not just text — the agent doesn't have to re-parse prose.
Docs searchsearch_tissue_docs lets the agent look up exact syntax instead of guessing.
Current protocolNegotiates up to MCP 2025-11-25 and works with today's clients out of the box.

Add the server, sign in, and ask Claude to deploy something:

claude mcp add --transport http tissue https://tissue.systems/mcp

The full guide — browser login and token setup for Claude Code, Claude Desktop, Claude.ai, and Cursor, plus the complete tool and scope reference — lives at docs.tissue.systems/docs/mcp.