MCP clients

One endpoint, one header. Selat is a Streamable HTTP MCP server, so any client that speaks that transport can use it without a bridge process.

endpoint  https://api.selat.weekndlabs.com/mcp
header    Authorization: Bearer slt_live_...

There is no stdio wrapper and nothing to install. The endpoint is stateless per request, so a client may reconnect whenever it likes.

Claude Code

claude mcp add --transport http selat https://api.selat.weekndlabs.com/mcp \
  --header "Authorization: Bearer slt_live_..."

Cursor

In ~/.cursor/mcp.json, or the project’s .cursor/mcp.json:

{
  "mcpServers": {
    "selat": {
      "url": "https://api.selat.weekndlabs.com/mcp",
      "headers": { "Authorization": "Bearer slt_live_..." }
    }
  }
}

Any other client

Clients that build their own MCP transport take a URL and a header map. This is the shape, using the MCP TypeScript SDK directly:

import { Client } from '@modelcontextprotocol/sdk/client/index.js'
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'

const transport = new StreamableHTTPClientTransport(
  new URL('https://api.selat.weekndlabs.com/mcp'),
  { requestInit: { headers: { Authorization: `Bearer ${token}` } } },
)
const client = new Client({ name: 'my-agent', version: '1.0.0' })
await client.connect(transport)

const { tools } = await client.listTools()
const result = await client.callTool({ name: 'github__list_issues', arguments: { owner: 'o', repo: 'r' } })

Agent platforms that store MCP servers as records usually want the same two fields under an http transport: a url and a headers object. Nothing else is needed.

Tool names

Every tool is namespaced by its provider, so github__list_issues and gcal__list_calendars can never collide. Some clients prefix the name again with the server label they gave you, which is why naming the server selat produces selat__selat_search_tools. Name it after what it holds, for example apps, and the result reads better.

When the catalog is large

Selat serves at most 60 tools to a client, because agents degrade well before that. When a workspace has more, the list is capped and a meta tool appears:

selat__search_tools
  query   free text, for example "create a jira issue"

It searches everything the workspace has enabled, including what the capped list left out, and returns names and input schemas ready to pass straight to tools/call. Calling it is free and is never metered.