Use the Kortix Executor to reach external systems from a session. Prefer the `kortix executor` CLI for agent work, use `@kortix/executor-sdk` for durable TypeScript workflows and reusable skills, and treat the `kortix executor mcp` server as an optional compatibility face. Load whenever the user asks the agent to act in an external app/API, inspect available connectors/tools, add/configure a connector, or work with `connectors:` in kortix.yaml.
kortix executor CLI:kortix executor connectors - list usable connectors and their tools.kortix executor discover "<intent>" - search tools by natural-language need.kortix executor describe <connector>.<action> - inspect one tool schema.kortix executor call <connector> <action> '<json-args>' - run a tool.kortix executor add/rm/connect - manage connectors and setup links.@kortix/executor-sdk - TypeScript client for multi-step workflows,
reusable scripts, skills, agents, and app code.kortix executor mcp - optional stdio MCP server with stable meta-tools.
Do not assume the MCP tools are present in the current tool list. Use the CLI
first unless the current runtime explicitly exposes the MCP tools.$KORTIX_EXECUTOR_TOKEN/$KORTIX_CLI_TOKEN; it does not carry raw third-party
API keys.
connectors: in kortix.yaml.kortix executor connectors
kortix executor discover "send an email"
kortix executor describe email_email_inbox_bjgk.reply_message
kortix executor call email_email_inbox_bjgk reply_message \
'{"inbox_id":"email-inbox@agentmail.to","message_id":"<message-id>","text":"Reply text"}'
call takes <connector> <action> <json-args>. The <action> is the part after
the connector slug in the tool path. For email_email_inbox_bjgk.reply_message,
the connector is email_email_inbox_bjgk and the action is reply_message.args.__select, for example:kortix executor call internal_graph query.user \
'{"id":"1","__select":"id name email"}'
references/executor-sdk.md.import { createExecutorClient } from '@kortix/executor-sdk';
const executor = createExecutorClient({
apiUrl: process.env.KORTIX_API_URL!,
token: process.env.KORTIX_CLI_TOKEN ?? process.env.KORTIX_EXECUTOR_TOKEN!,
projectId: process.env.KORTIX_PROJECT_ID,
});
const matches = await executor.discover('send an email', { limit: 5 });
const tool = await executor.describe(matches[0]!.tool);
if (!tool) throw new Error('email tool not found');
const result = await executor.call('email_email_inbox_bjgk', 'reply_message', {
inbox_id: 'email-inbox@agentmail.to',
message_id: '<message-id>',
text: 'Reply text',
});
if (!result.ok) throw new Error(`Executor call failed: ${result.reason ?? result.status ?? 'unknown'}`);
console.log(JSON.stringify(result, null, 2));
bun run path/to/script.ts. Keep credentials out of
code; pass only Kortix auth/context from env and let the gateway resolve
third-party secrets.
kortix executor call github request '{
"method": "POST",
"url": "https://api.github.com/repos/kortix-ai/suna/issues/1234/comments",
"body": { "body": "Review note..." }
}'
request args: method, absolute url, optional JSON body, and optional
headers. The upstream status and response come back through the Executor
envelope. OpenAPI, HTTP, and GraphQL connectors normally expose their whole spec
as named tools, so they usually do not need request.
connectors:
- slug: stripe
name: Stripe API
provider: openapi
spec: https://raw.githubusercontent.com/stripe/openapi/master/openapi/spec3.json
auth:
type: bearer
# secret value entered through setup link, never in git
pipedream - app slug + one-click OAuth; includes the generic request
action for full app API access.openapi, graphql, http - declared spec/endpoint/base URL plus auth.mcp - remote MCP server endpoint.channel - synthesized chat/email connectors such as Slack and AgentMail.computer - synthesized connected-machine connector.kortix executor add github --provider pipedream --app github
kortix executor connect github
request_secret via the optional MCP face when available, or the equivalent
Kortix connector/secret setup command when exposed by the CLI).slack/kortix_slack are reserved slugs; executor add
rejects them). When the user asks to connect Slack, run:kortix channels connect
kortix channels status shows the connected workspace and the slack
CLI + kortix_slack.* tools work immediately. Only if connect itself reports
that one-click install is unavailable (self-host without the shared Slack app)
does the manual path apply — it walks you through kortix channels manifest +
kortix channels connect --manual.