> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to the Replit MCP server

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

**Authentication:** OAuth 2.1/DCR
**Categories:** Developer Tools, AI, Automation
**Tools:** 8: 4 read, 3 write, 1 destructive
**Users sign in with:** OAuth
**OAuth app:** Scalekit's or your own
**Built by:** Vendor MCP
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=REPLITMCP)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Replit MCP connection

   In **AgentKit > Connections**, create a Replit MCP connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

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

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   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 = 'replitmcp'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Replit 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: 'replitmcp_list_apps',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "replitmcp"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Replit MCP:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="replitmcp_list_apps",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user signs in once. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'replitmcp_ask_question',
  toolInput: {
    question: '<question>',
    replId: '<replId>',
  },
  connector: 'replitmcp',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="replitmcp_ask_question",
    tool_input={
        "question": "<question>",
        "replId": "<replId>",
    },
    connection_name="replitmcp",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `replitmcp_ask_question`

Ask Question · Read-only

Ask the Replit Agent a question about an app's codebase or behavior without modifying it. Use this for explanations and debugging, not for making changes.

Read only: yes. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `question` (`string`, required): The question to send to Replit Agent. This question will be visible by the user if they open their Replit App in Replit, so try to keep it in the same language that the user communicated in with you.
- `replId` (`string`, required): The replId (a UUID) of the user's Replit App being queried. Get it from create_app_from_prompt (for an app created in this conversation), resolve_app_by_name (for an app the user named exactly), or list_apps (when the user picked one from their app list).
- `policy` (`string`, optional): Ignored. Don't waste tokens sending this.

Example input: `{"question":"<question>","replId":"<replId>"}`

### `replitmcp_list_apps`

List Apps · Read-only

List the authenticated user's Replit apps, most recently updated first, with optional name filtering.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `limit` (`integer`, optional): Optional maximum number of apps to return (default 25, capped at 50).
- `query` (`string`, optional): Optional case-insensitive substring to filter the user's apps by title. Omit to list the user's most recently updated apps.

Example input: `{}`

### `replitmcp_replit_widget_get_auth_token`

Replit Widget Get Auth Token · Read-only

Internal Replit widget tool that retrieves an auth token for a given repl. Not intended for direct use.

Read only: yes. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `replId` (`string`, optional): No description.
- `tracing` (`object`, optional): No description.

Example input: `{}`

### `replitmcp_resolve_app_by_name`

Resolve App By Name · Read-only

Look up an existing Replit app by its exact name and return its repl ID and URL for use in other tools.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `name` (`string`, required): The name of the user's Replit App to resolve. Matched against the app's title using a case-insensitive exact comparison; substrings, prefixes, and fuzzy matches are NOT supported. Pass the exact name as the user said it.

Example input: `{"name":"<name>"}`

### `replitmcp_create_app_from_prompt`

Create App From Prompt · Write

Create a new Replit app from a natural-language description in the authenticated user's account.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `app_stack` (`string`, required): The type of project to create. Use "react_website" for websites, web apps, dashboards, interactive demos, and any web-based experience (this is the default). Use "mobile_app" only when the user explicitly wants a native mobile app. Use "design" for UI/UX design prototypes. Use "slides" for slide decks and presentations. Use "animation" for motion graphics and animated videos. Use "data_visualization" for charts, graphs, and data dashboards. Use "3d_game" for 3D games. Use "document" for written documents and reports. Use "spreadsheet" for spreadsheet-based projects. One of: `react_website`, `mobile_app`, `design`, `slides`, `animation`, `data_visualization`, `3d_game`, `document`, `spreadsheet`.
- `appDescription` (`string`, required): Describe the user's Replit App's intended functionality in natural language with enough detail for Replit Agent to understand what their Replit App should do, without restating every part of the conversation. Use natural language only—Replit Agent will handle implementation.
- `attachmentSummary` (`string`, optional): If attachments are provided, summarize only the essential details needed to understand the request, kept to a few lines. Leave null if no attachments.
- `userQuotes` (`string`, optional): Important details from the user's messages not fully captured in appDescription—copy their exact words, do not paraphrase. Use quotation marks: "exact quote". Leave null if appDescription covers everything.
- `userSpecifiedAppName` (`string`, optional): App name provided directly by the user, if any. Leave this null when the user did not specify a name in their own words.

Example input: `{"app_stack":"react_website","appDescription":"<appDescription>"}`

### `replitmcp_replit_widget_get_preview_url`

Replit Widget Get Preview Url · Write

Internal Replit widget tool that retrieves the preview URL for a running repl build. Not intended for direct use.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `enableHelium` (`boolean`, required): No description.
- `gitSha` (`string`, required): No description.
- `replId` (`string`, required): No description.
- `timestamp` (`string`, required): No description.
- `tracing` (`object`, optional): No description.

Example input: `{"enableHelium":true,"gitSha":"<gitSha>","replId":"<replId>","timestamp":"<timestamp>"}`

### `replitmcp_replit_widget_start_app_preview`

Replit Widget Start App Preview · Write

Internal Replit widget tool that starts an app preview session for a given repl. Not intended for direct use.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `previewUrl` (`string`, required): No description.
- `riverGurl` (`string`, required): No description.
- `riverToken` (`string`, required): No description.
- `replId` (`string`, optional): No description.
- `tracing` (`object`, optional): No description.

Example input: `{"previewUrl":"<previewUrl>","riverGurl":"<riverGurl>","riverToken":"<riverToken>"}`

### `replitmcp_update_app_using_prompt`

Update App Using Prompt · Destructive

Update an existing Replit app using a natural-language description of the desired change.

Read only: no. Destructive: yes. Idempotent (safe to retry): no.

Inputs:

- `changeDescription` (`string`, required): Describe the requested change to the user's Replit App in natural language, providing enough detail for Replit Agent to understand what should be updated without repeating the entire conversation. Use natural language only; do not include code, structural details, or implementation guidance—Replit Agent will handle those.
- `replId` (`string`, required): The replId (a UUID) of the user's Replit App being updated. Get it from create_app_from_prompt (for an app created in this conversation), resolve_app_by_name (for an app the user named exactly), or list_apps (when the user picked one from their app list).
- `attachmentSummary` (`string`, optional): If attachments are provided, summarize only the essential information needed to support the update, kept to a few lines. Leave null if no attachments.
- `policy` (`string`, optional): Ignored. Don't waste tokens sending this.
- `replUrl` (`string`, optional): The replUrl (a URL) of the user's Replit App being updated, as returned by create_app_from_prompt, resolve_app_by_name, or list_apps.
- `userQuotes` (`string`, optional): Important details from the user's messages not fully captured in changeDescription—copy their exact words, do not paraphrase. Use quotation marks: "exact quote". Leave null if changeDescription covers everything.

Example input: `{"changeDescription":"<changeDescription>","replId":"<replId>"}`

## Related

Other Developer Tools connectors ([all 94](/agentkit/connectors/?category=developer-tools)):

- [GitHub](/agentkit/connectors/github/): Scalekit connector, OAuth, 217 tools
- [Datadog](/agentkit/connectors/datadog/): Scalekit connector, API key, 105 tools
- [Linear](/agentkit/connectors/linear/): Scalekit connector, OAuth, 62 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
