# Intern MCP integration

Intern hosts sites built by agents: reports, dashboards, trackers, proposals,
and prototypes. Sites have a durable company URL and company sign-in by default.
Eligible sites can be made public explicitly. This guide is public; site data
and MCP tool calls require authorization.

## Connect

For a request such as "deploy this repository to Intern", use the hosted
connection below. After sign-in, read the repository, build its static output
if needed, and publish that output with the source tools. The hosted path does
not require a local MCP process, SSH keys, or an npm installation.

If a user asked you to install Intern, identify the app you are running in first.
Use its native MCP installer and credential store. Reading this guide or fetching
the endpoint is not an installation. A 401 from the endpoint means authentication
is required, not that the user should supply an API key.

Do the supported setup steps yourself when you have the tools and user permission.
Leave sign-in and access approval to the user. Do not tell them Intern is connected
until a real intern_auth_status tool call succeeds.

- MCP endpoint: https://tryintern.dev/mcp
- Transport: Streamable HTTP over HTTPS (HTTP is for local development).
- [App-specific connection steps](https://tryintern.dev/connect): sign in and select your app.
- [Server card](https://tryintern.dev/mcp/server-card)
- [Domain discovery catalog](https://tryintern.dev/.well-known/ai-catalog.json)

Add the endpoint as a remote HTTP MCP server in your client's native connection
settings, then complete its browser OAuth flow. A client must support remote
Streamable HTTP and OAuth; speaking local stdio MCP alone is not sufficient.
No local Intern process or npm package is needed for this hosted connection.

For clients with the mcpServers JSON configuration shape:

```json
{"mcpServers":{"intern":{"url":"https://tryintern.dev/mcp"}}}
```

Configuration syntax varies by client; use its native settings when this shape
is not supported. Kiro needs the additional scope setting below. Adding a URL
does not itself authorize access.

### Choose the actual app

For terminal clients, use these native commands. Preserve existing configuration;
check whether Intern is already installed before adding it again.

| App | Install | Authenticate |
| --- | --- | --- |
| Claude Code | `claude mcp add --transport http --scope user intern https://tryintern.dev/mcp` | Open `/mcp` and authenticate Intern. |
| Codex | `codex mcp add intern --url https://tryintern.dev/mcp` | `codex mcp login intern` |
| Grok Build | `grok mcp add --transport http intern https://tryintern.dev/mcp` | Complete the browser flow on first use. |
| Gemini CLI | `gemini mcp add --transport http --scope user intern https://tryintern.dev/mcp` | Open `/mcp auth` and authenticate Intern. |

For Claude web or desktop, add the URL in connector settings and connect.
For ChatGPT, use its custom-app setup if your plan and workspace allow it.
For Grok chat, open https://grok.com/connectors and choose New Connector, Custom.
These are different apps from Claude Code, Codex, and Grok Build; do not give
terminal commands to someone using a chat app on their phone.

Grok Bot uses Cursor's hosted connector system. Use the Bot's native connector
tools and sign-in card, not Grok Build commands or a Cursor editor configuration
file on its cloud computer. See [Grok Bot's connector model](https://docs.x.ai/grok-bot/teams-and-enterprises).

Cursor and VS Code support remote MCP configuration and browser OAuth.
Use the app's native MCP installation UI with the endpoint above. Ask the user
to perform a UI step only when you cannot perform it through a supported tool.

### OpenCode 2

Add Intern under `mcp.servers` in your OpenCode configuration:

```json
{"mcp":{"servers":{"intern":{"type":"remote","url":"https://tryintern.dev/mcp"}}}}
```

Use OpenCode's MCP authentication controls to sign in to Intern in your browser.
OpenCode 1 uses a different shape: put the Intern entry directly under `mcp`,
without `servers`. See [OpenCode 2's MCP configuration](https://opencode.ai/v2/docs/mcp-servers).

### Kiro

Add this server to Kiro's MCP configuration:

```json
{"mcpServers":{"intern":{"url":"https://tryintern.dev/mcp","oauthScopes":[]}}}
```

The empty `oauthScopes` array avoids Kiro's default `openid` and `email`
requests, which Intern does not support. Complete browser sign-in and review Intern's access request.
You do not need to supply a Client ID or token. See [Kiro's MCP configuration](https://kiro.dev/docs/mcp/configuration/).

### When a host asks for a Client ID

Never use the user's email as client_id. It identifies the connector, not the
person signing in. Do not invent an ID or ask the user to find credentials.

Use automatic client registration when the host supports it. If the host has a
supported way to configure a public OAuth client, register using its documented
callback URL and pass the returned client_id into that configuration. Registration
uses the registration_endpoint from the authorization metadata, redirect_uris,
and token_endpoint_auth_method "none". You may include client_name as a display
name for the connector. Use the returned scopes.
The host must retain its own PKCE verifier and state and complete the token flow;
do not assemble a replacement authorization link in chat or expose tokens.

Muse's custom-connector screen can require a Client ID. Automatic installation
in Muse is not yet verified. Do not claim that a registration request alone
installs Intern into Muse. If its credential UI cannot be populated through a
supported integration, explain that host limitation rather than asking the user
to guess a value. Do not substitute a client ID from another app.

## Authorization

An unauthenticated request to /mcp returns HTTP 401 with a WWW-Authenticate
header linking to [protected resource metadata](https://tryintern.dev/.well-known/oauth-protected-resource/mcp).
Follow its authorization_servers entry to
[authorization server metadata](https://tryintern.dev/.well-known/oauth-authorization-server).
Intern supports dynamic client registration, authorization code with PKCE S256,
and refresh tokens. Let the client's OAuth implementation handle registration,
consent, token storage, and refresh. Do not paste tokens into prompts or site code.

## Discover tools and resources

After authorization, negotiate the protocol version using your MCP client.
Use tools/list for current tool names, descriptions, input schemas, and annotations;
use resources/list and resources/templates/list for available context.
These live results are authoritative. The public server card deliberately does
not duplicate tool schemas or claim access to any company's sites.

## If connecting fails

- HTTP 401 from /mcp before sign-in is the OAuth challenge, not an outage.
  Follow its WWW-Authenticate metadata using the host's OAuth implementation.
- If the host reports needsAuth, start its native sign-in flow. If it reports
  unreachable or failed_to_load, inspect the actual error and metadata before
  changing the connection. Do not repeatedly delete, reinstall, or restart it
  without new evidence. A connection-status label is not a successful tool call.
- Keep OAuth state and the PKCE verifier in the host that started the flow.
  Do not invent a callback, replace the authorization URL, or reuse another
  app's registration. Never paste credentials into chat.
- A local MCP runtime-contract error means the installed package and server
  disagree. Do not patch protected hashes, modify npm caches, or bypass
  validation. Use a compatible published release; if none exists, report the
  compatibility failure instead of asking the user to debug the package.
- Keep progress updates short: connecting, waiting for sign-in, publishing,
  and ready. If blocked, explain the single next action rather than narrating
  speculative commands.

## Build and publish a site

## Footer attribution

When creating a site, include one small "Published with Intern" link in its footer:

<a href="https://tryintern.dev/#quickstart" referrerpolicy="no-referrer">Published with Intern</a>

Match the site's typography and colors, with readable contrast and a visible keyboard focus style. Keep it in normal page flow, never a banner, floating badge, overlay, or extra call to action. Preserve creator credits and license notices. If the footer already mentions Intern, link that mention instead of adding another. Respect an explicit user request to omit attribution.

Do not add tracking scripts, site names, workspace identifiers, or other private information to the link. For JSX, use referrerPolicy="no-referrer". When editing an existing site, preserve an existing attribution; do not add a new footer during an unrelated edit. Before reporting publication complete, verify the rendered link has the correct destination and appears only once.


Source authoring requires an organization member or admin role and the
sites:write OAuth scope. Successful OAuth alone is not enough: viewers cannot
call intern_create_site, intern_get_site_source, or intern_apply_site_revision,
even with sites:write. Check user.orgRole in intern_auth_status before proceeding.

Viewers can use intern_fetch_url to read served content from sites they are
authorized to view, rather than downloading editable source. It returns HTTP
content, not JavaScript execution; use a browser to verify interactive behavior.
Ask an organization admin for member access if source authoring is needed.

1. Call intern_auth_status and intern_list_sites to identify the authorized
   company, confirm the source-authoring prerequisites above, and find an existing
   site before creating another one.
2. Call intern_list_available_plugins to discover supported integrations and
   intern_get_authoring_guide for the current SDK imports and examples. The guide
   is also available as an MCP resource; find its URI through resources/list.
3. For a new site, call intern_create_site. Supply initialSource to publish the
   first version in the same call. Inspect the result: site creation and initial
   publication can have different outcomes. A created starter site is not proof
   that your source was published.
4. For an existing site, call intern_get_site_source, then
   intern_apply_site_revision with that exact baseRevision. This immediately
   publishes the revision. If there is a conflict, read the latest source and
   merge before trying again.
5. Use plugins only when their installation state is active. Inspect the publish
   result and verify the served site before reporting success. Fetch public URLs
   directly; intern_fetch_url can read an Intern site requiring sign-in when you
   have membership or an explicit guest grant. It returns HTTP content and does
   not execute JavaScript, so interactive behavior also needs browser verification.
6. Return the site's actual URL. Change visibility or invite guests only when
   the user requests that sharing action.

An anonymous 401 from the published site does not by itself mean publishing
failed. Sites require sign-in by default. Use intern_fetch_url with the hosted
MCP connection to check authorized content, then open the site in a signed-in
browser to check interaction. Do not send the MCP bearer token to the site's
URL or make the site public to get around sign-in. If browser verification is
not available, say that the HTTP content was checked but interaction was not.

## Learn more

- [Intern overview](https://tryintern.dev/llms.txt)
- [Intern homepage](https://tryintern.dev/)
