Custom Tools

Service Connectors

Service connectors let your AI talk to external services — GitHub, Slack, weather APIs, your CRM, anything with an API. You describe what you need; your AI builds the connector and handles authentication.

You don't write this code

The code blocks below show what your AI generates under the hood. You just describe what you want in plain language: "build me a tool that creates GitHub issues."


Creating an HTTP Proxy Tool

create_dynamic_tool({
  name: "github_create_issue",
  description: "Create an issue in a GitHub repository",
  tool_type: "http_proxy",
  input_schema: {
    type: "object",
    properties: {
      owner: { type: "string", description: "Repository owner" },
      repo: { type: "string", description: "Repository name" },
      title: { type: "string", description: "Issue title" },
      body: { type: "string", description: "Issue body" }
    },
    required: ["owner", "repo", "title"]
  },
  http_config: {
    method: "POST",
    url_template: "https://api.github.com/repos/{{owner}}/{{repo}}/issues",
    body_template: {
      title: "{{title}}",
      body: "{{body}}"
    },
    headers: {
      "Accept": "application/vnd.github.v3+json"
    },
    connection_id: "my-github-connection"
  },
  activate: true
})

HTTP Config Options

FieldTypeDescription
methodstringHTTP method: GET, POST, PUT, DELETE, PATCH
url_templatestringURL with {{variable}} placeholders
body_templateobjectRequest body with placeholders
headersobjectStatic headers to include
connection_idstringID of connection for auth
response_transformstringJSONata expression to transform response

Template Syntax

Use {{variable}} to insert input values:

{
  "url_template": "https://api.example.com/users/{{userId}}/posts",
  "body_template": {
    "title": "{{title}}",
    "content": "{{content}}",
    "tags": "{{tags}}"
  }
}

Nested Access

{{user.profile.name}}

Setting Up Connections

Before using HTTP proxy tools, create a connection for authentication:

API Key Authentication

create_connection({
  name: "my-github-connection",
  provider: "github",
  auth_type: "api_key",
  api_key_config: {
    key: "ghp_xxxxxxxxxxxxxxxxxxxx",
    header_name: "Authorization",
    prefix: "Bearer "
  }
})

Bearer Token

create_connection({
  name: "my-api-connection",
  provider: "custom",
  auth_type: "bearer",
  api_key_config: {
    key: "your-token-here"
  }
})

Basic Auth

create_connection({
  name: "my-basic-auth",
  provider: "custom",
  auth_type: "basic",
  basic_auth_config: {
    username: "user",
    password: "pass"
  }
})

Response Transform

Transform API responses using JSONata:

{
  http_config: {
    // ...
    response_transform: "data.items"
  }
}

Common transforms:

// Extract nested data
response.data.results

// Map to simpler structure
$map(response.items, function($v) { {"id": $v.id, "name": $v.name} })

// Filter results
$filter(response.items, function($v) { $v.active })

Example: Slack Notification

create_connection({
  name: "slack-webhook",
  provider: "slack",
  auth_type: "bearer",
  api_key_config: {
    key: "xoxb-your-token"
  }
})

create_dynamic_tool({
  name: "slack_post_message",
  description: "Post a message to a Slack channel",
  tool_type: "http_proxy",
  input_schema: {
    type: "object",
    properties: {
      channel: { type: "string" },
      text: { type: "string" }
    },
    required: ["channel", "text"]
  },
  http_config: {
    method: "POST",
    url_template: "https://slack.com/api/chat.postMessage",
    body_template: {
      channel: "{{channel}}",
      text: "{{text}}"
    },
    connection_id: "slack-webhook"
  }
})

Example: Weather API

create_connection({
  name: "weather-api",
  provider: "openweathermap",
  auth_type: "api_key",
  api_key_config: {
    key: "your-api-key",
    query_param: "appid"
  }
})

create_dynamic_tool({
  name: "get_weather",
  description: "Get current weather for a city",
  tool_type: "http_proxy",
  input_schema: {
    type: "object",
    properties: {
      city: { type: "string" }
    },
    required: ["city"]
  },
  http_config: {
    method: "GET",
    url_template: "https://api.openweathermap.org/data/2.5/weather?q={{city}}&units=metric",
    connection_id: "weather-api",
    response_transform: "{ 'temp': main.temp, 'description': weather[0].description }"
  }
})

Testing

Test tools before activating:

"test tool github_create_issue with owner='test' repo='test' title='Test Issue'"
Previous
Overview