Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to the Send MCP server

Vendor MCP
Open markdown

The Send MCP connector routes your AI agent's tool calls to Send's own MCP server through Scalekit. Each user signs in to Send once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 12 tools.

Tools
12
What they doRead · write · destructive
5 · 4 · 35 read4 write3 destructive
Users sign in with
OAuth app
Scalekit's or your own

What you can do

  • Create shareable pages: generate HTML sites and documents that can be shared by link
  • Edit existing pages: fetch a site or document and change its content, wording, or styling
  • Manage page settings: read and change the settings of sites and documents the user owns
  • Upload and manage images: upload images and browse or fetch them from the workspace gallery
  • Manage skills: create, update, delete, pin, and search reusable skills and templates for the workspace

Setup

  1. Install the SDK

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. Create the Send MCP connection

    In AgentKit > Connections, create a Send MCP connection. The name you give it is the connection_name your code passes. See Configure connections.

    Scalekit credentials are available for Send MCP server, so you don't need to register an OAuth app.

  4. Authorize a user and make your first call

    quickstart.mts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    import { createInterface } from 'node:readline/promises'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENVIRONMENT_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'sendmcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Send MCP:', link)
    const rl = createInterface({ input: process.stdin, output: process.stdout })
    await rl.question('Press Enter after authorizing...')
    rl.close()
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'sendmcp_get_image_gallery',
    toolInput: {},
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user signs in once. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • sendmcp_get_skillsFetches skills by ID, lists available skills, or semantically searches them.Read-only

    Loading skills...

    Fetches skills by ID, lists available skills, or semantically searches them. Skills were previously called 'guidelines', and users may also say 'template' — when the user mentions making, editing, searching, or using a Send skill, guideline, or template, they mean these. Skills shape how sites are created — brand systems, layout patterns, doc-type playbooks. Workspace skills (created by this team) outrank Send skills (official, send/* ids) when both fit. With id: returns the skill including its full content — pass an array of ids to load several in one call. With query: semantic search — describe what the user is making and get the best-matching skills grouped by source with similarity scores. Neither: returns a list of all available skills (name and description only), workspace skills first.

    Inputs

    idstring
    ID of the skill to load, or an array of IDs to load several at once. Returns full content.
    querystring
    Natural-language description of what the user is making. Returns the best-matching skills ranked by similarity. Ignored when id is provided.
  • sendmcp_getsiteFetch an existing Send site or document by share URL or share ID.Read-only

    Fetching site...

    Fetch an existing Send site or document by share URL or share ID. Returns the full HTML source and metadata; the response includes shareId for EditSite or CreateSite (copy mode).

    Inputs

    shareIdOrUrlstringrequired
    The document's share ID (8-char alphanumeric string), slug (e.g. 'my-proposal-RaU0Kud4'), or full URL (e.g. 'https://send.co/a/RaU0Kud4').
  • sendmcp_showcontentEmbeds Send-managed content inline in the chat.Read-only

    Show Content

    Embeds Send-managed content inline in the chat. Pass type 'doc' with the shareId to render a published HTML document inline so the user can view it. Call this after CreateDocument or EditDocument when the user should see the result. Requires the user to be signed in to Send.

    Inputs

    idstringrequired
    The Send share ID (8-char alphanumeric string) or full /a/ URL of the document to display. Returned by CreateDocument. Example: 'RaU0Kud4' or 'https://send.co/a/RaU0Kud4'.
    typestringrequired
    Component type to embed. Only 'doc' is currently supported — renders a published Send HTML document inline in the chat.one of doc
  • sendmcp_submit_feedbackSends feedback about Send itself to the team that builds it.Read-only

    Sending feedback...

    Sends feedback about Send itself to the team that builds it. Call it when the session produces something the team would genuinely want to know: the user explicitly asks to send feedback or report a problem, aims praise or frustration at Send, Send can't do something the user wants and it matters to them, or you form a strong opinion worth volunteering. Most sessions produce none — ordinary friction is not signal. When you do call it, context is the entire value: what the user was making, what they expected, and what happened instead. Not for feedback about Claude, or about anything that isn't Send. Only include detail the user is ok with sharing as feedback.

    Inputs

    feedbackstringrequired
    What the Send team should know. Be specific: what broke, what confused, or what worked well.
    sentimentstringrequired
    Whether this is praise, a problem, or both. Praise is signal too — send it.one of positivenegativemixed
    areastring
    Which part of Send this is about, if it's clear.one of creatingeditingskillsimagessharingviewingother
    contextstring
    What was being made and what was expected. The concrete details are what make this actionable.
    shareIdstring
    Optional. Share ID of the site involved, if any — a new user may not have one, and that's fine.
  • sendmcp_complete_uploadConfirms a direct-to-storage upload completed successfully.Write

    Complete Upload

    Confirms a direct-to-storage upload completed successfully. Call this after uploading to the presigned URL returned by create_presigned_upload. Returns the registered file ID that can be referenced in documents as <img src="asset:{fileId}">. This is step two of the two-step image upload flow.

    Inputs

    bucketstringrequired
    The storage bucket used for the upload. Returned as part of the presigned upload response from create_presigned_upload.
    filenamestringrequired
    The original filename of the uploaded file. Must match what was passed to create_presigned_upload. Example: 'hero-image.png'.
    keystringrequired
    The storage key (path) used for the upload. Returned as part of the presigned upload response from create_presigned_upload.
    mime_typestringrequired
    The MIME type of the uploaded file. Must match what was passed to create_presigned_upload. Example: 'image/png'.
    sizenumberrequired
    The final file size in bytes after the upload completed.
    heightinteger
    Image height in pixels. Provide when the uploaded file is an image. Pass null for non-image files.
    widthinteger
    Image width in pixels. Provide when the uploaded file is an image. Pass null for non-image files.
  • sendmcp_create_presigned_uploadCreates a presigned upload target URL so files can be uploaded directly to storage.Write

    Create Presigned Upload

    Creates a presigned upload target URL so files can be uploaded directly to storage. This is step one of the two-step image upload flow. Call this first to get the presigned URL, upload the file directly to that URL, then call complete_upload to confirm the upload and register the file.

    Inputs

    filenamestringrequired
    The original filename of the file to upload. Example: 'hero-image.png'.
    mime_typestringrequired
    The MIME type of the file. Example: 'image/png', 'image/jpeg', 'image/webp'.
  • sendmcp_createsiteCreates a Send site or document — a shareable HTML page.Write

    Developing site...

    Creates a Send site or document — a shareable HTML page. Making one takes two calls. First call — intent only. One line on what the user is making and why. Nothing is created. Returns any skills this workspace expects you to follow — brand rules, layouts, tone — and an intentId. Second call — html plus that intentId. See the html field for format requirements. To copy an existing site instead of writing one, pass sourceShareId (share ID or URL) with no html.

    Inputs

    htmlstring
    The complete, self-contained HTML document to publish. Return ONLY raw HTML. No markdown, no code fences, no explanation. Single file: <body> then <style> then <script>. Start with <!DOCTYPE html>, then <html>, <head>, <body>. Zero external dependencies — pure CSS and vanilla JS only. Wrap each section in <section></section>. Fully responsive, mobile-first. Every interactive element must work. Reference images as <img src="asset:{fileId}"> — do not base64-encode. Every <a href> link: use target="_blank" rel="noopener noreferrer". For icons, use <i data-lucide="name"></i>.
    intentstring
    One line on what the user is making. ALWAYS send it alone first — no html. Returns any matching skills + an intentId.
    intentIdstring
    ALWAYS pass this back unchanged on the second call. Returned by the first; links the request to what got made.
    sourceShareIdstring
    The share ID or URL of an existing document to copy. When provided, the new document starts as an exact copy of the source — do not pass html.
    titlestring
    Title of the document. Something short and simple that describes the document.