> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orq.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Create Tools

> Add function calling to LLM applications with tools. Create HTTP, Python, MCP, or JSON Schema tools to integrate AI models with external APIs and services.

Tools give models the ability to take action: call an API, run code, call an MCP, or invoke any external service. Tools require a model with function calling support,  look for the `tools` tag in the [AI Router](/docs/router/using-the-router).

The following Tools are available:

<CardGroup cols={3}>
  <Card title="Function Tool" icon="function" href="#function-tool">
    Define a callable function using JSON Schema. The model decides when to call it and fills in the parameters.
  </Card>

  <Card title="JSON Schema Tool" icon="brackets-curly" href="#json-schema-tool">
    Enforce structured output from the model using a full JSON Schema definition.
  </Card>

  <Card title="HTTP Tool" icon="globe" href="#http-tool">
    Make a real HTTP request to an external API at runtime. No extra code needed.
  </Card>

  <Card title="MCP Tool" icon="https://mintcdn.com/orqai/i7ZhKI7LFRfXU7ox/images/logos/mcp.svg?fit=max&auto=format&n=i7ZhKI7LFRfXU7ox&q=85&s=cef7916eb5fe1f6bb97541398d3f7639" href="#mcp-tool" width="16" height="16" data-path="images/logos/mcp.svg">
    Connect to a Model Context Protocol server. **Orq.ai** discovers available capabilities automatically.
  </Card>

  <Card title="Python Tool" icon="python" href="#python-tool">
    Run arbitrary Python code at runtime. Define logic and parameters directly in the Studio.
  </Card>
</CardGroup>

## <Icon icon="function" size={32} color="#2F554D" />   Function Tool

<Tabs>
  <Tab title="AI Studio" icon="https://mintcdn.com/orqai/My16MDKJXrKALEHC/images/logos/ai-studio-round.svg?fit=max&auto=format&n=My16MDKJXrKALEHC&q=85&s=ac04dd509320d58ab9701cb6d6137733" width="100" height="100" data-path="images/logos/ai-studio-round.svg">
    Define a callable function using JSON Schema. The model decides when to call it and fills in the parameters.

    <Steps>
      <Step title="Add a new Tool to a Project">
        Use the `+` button to add a new Entity to a [Project](/docs/projects/overview).

        <Frame caption="Select Function Tool">
          <img src="https://mintcdn.com/orqai/G4rM3xl_79XLicq-/images/tool-add.png?fit=max&auto=format&n=G4rM3xl_79XLicq-&q=85&s=da31a85741218831aac7aac827d27e44" alt="Tool Add" width="591" height="215" data-path="images/tool-add.png" />
        </Frame>
      </Step>

      <Step title="Enter Tool Details">
        Enter the main details of the tool:

        * **Key**, used by models to reference the tool
        * **Name**, used in the studio to find the tool
        * **Description**, used to describe the tool

                  <Warning>
                    Make the Description as precise as possible, it is used notably by [Agents](/docs/agents/overview) when looking up relevant tools for their tasks.
                  </Warning>

        <Frame caption="Configure all fields">
          <img src="https://mintcdn.com/orqai/G4rM3xl_79XLicq-/images/function-tool-configure.png?fit=max&auto=format&n=G4rM3xl_79XLicq-&q=85&s=d6308c34d96dd29a1a1bdc7d9ac32e0d" alt="Function Tool Configure" width="624" height="474" data-path="images/function-tool-configure.png" />
        </Frame>
      </Step>

      <Step title="Configure your Function Tool">
        Function Tools are defined using JSON.

        Here is an example of a JSON schema for a function `get_current_weather` that declares the fields `location (string)` and `unit (string)`:

        ```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
        {
          "type": "object",
          "properties": {
            "unit": {
              "type": "string",
              "description": "The temperature unit, e.g. Celsius"
            },
            "location": {
              "type": "string",
              "description": "The city and state, e.g. San Francisco, CA"
            }
          },
          "required": [
            "location",
            "unit"
          ]
        }
        ```

        <Info>
          The object defined here is based on [JSON Schema](https://json-schema.org/). This framework allows for extensible definition that fit your ideal function definition.
        </Info>

        **Type**

        Use here any of the valid JSON types: `object`, `string`, `integer`, `number`, `array`, etc. The top-level type will most commonly be an `object` holding other properties.

        Learn more about all JSON types in [the JSON Schema definition](https://json-schema.org/understanding-json-schema/reference/type).

        **Properties**

        Properties are definitions of fields within an object. Here you can define any new variable. Nested properties are allowed.

        **Required**

        The `required` array within an object defines which fields must be entered for a JSON payload to be validated.
      </Step>

      <Step title="Publish your Tool">
        Once your tool is configured, click **Publish** to save a new version. Each published version is immutable and tracked in the [version history](#versions).
      </Step>
    </Steps>
  </Tab>

  <Tab title="API & SDK" icon="code">
    A Function Tool defines a callable function using a JSON Schema parameter definition. The model decides when to call it and fills in the parameters.

    | Field                 | Required | Description                                            |
    | --------------------- | -------- | ------------------------------------------------------ |
    | `key`                 | Yes      | Unique identifier (alphanumeric, hyphens, underscores) |
    | `path`                | Yes      | Project path, e.g. `"Default"`                         |
    | `type`                | Yes      | Must be `"function"`                                   |
    | `description`         | Yes      | Used by agents to decide when and how to call the tool |
    | `display_name`        | No       | Human-readable name shown in the Studio                |
    | `function.name`       | Yes      | Function name                                          |
    | `function.parameters` | Yes      | JSON Schema object describing the function parameters  |

    <CodeGroup>
      ```bash cURL theme={"theme":{"light":"github-light","dark":"github-dark"}}
      curl -X POST https://api.orq.ai/v2/tools \
        -H "Authorization: Bearer $ORQ_API_KEY" \
        -H "Content-Type: application/json" \
        -d '{
          "key": "get_weather",
          "display_name": "Get Weather",
          "description": "Returns the current weather for a given city",
          "path": "Default",
          "type": "function",
          "function": {
            "name": "get_weather",
            "parameters": {
              "type": "object",
              "properties": {
                "location": {
                  "type": "string",
                  "description": "The city name, e.g. Amsterdam"
                },
                "unit": {
                  "type": "string",
                  "description": "Temperature unit: celsius or fahrenheit"
                }
              },
              "required": ["location"]
            }
          }
        }'
      ```

      ```python Python theme={"theme":{"light":"github-light","dark":"github-dark"}}
      from orq_ai_sdk import Orq
      import os

      orq = Orq(api_key=os.environ["ORQ_API_KEY"])

      tool = orq.tools.create(request={
          "key": "get_weather",
          "display_name": "Get Weather",
          "description": "Returns the current weather for a given city",
          "path": "Default",
          "type": "function",
          "function": {
              "name": "get_weather",
              "parameters": {
                  "type": "object",
                  "properties": {
                      "location": {
                          "type": "string",
                          "description": "The city name, e.g. Amsterdam",
                      },
                      "unit": {
                          "type": "string",
                          "description": "Temperature unit: celsius or fahrenheit",
                      },
                  },
                  "required": ["location"],
              },
          },
      })
      ```

      ```typescript Node theme={"theme":{"light":"github-light","dark":"github-dark"}}
      import { Orq } from "@orq-ai/node";

      const orq = new Orq({ apiKey: process.env["ORQ_API_KEY"] ?? "" });

      const tool = await orq.tools.create({
        key: "get_weather",
        displayName: "Get Weather",
        description: "Returns the current weather for a given city",
        path: "Default",
        type: "function",
        function: {
          name: "get_weather",
          parameters: {
            type: "object",
            properties: {
              location: {
                type: "string",
                description: "The city name, e.g. Amsterdam",
              },
              unit: {
                type: "string",
                description: "Temperature unit: celsius or fahrenheit",
              },
            },
            required: ["location"],
          },
        },
      });
      ```
    </CodeGroup>

    <Tip>See the full [Create Tool API reference](/reference/tools/create-tool).</Tip>
  </Tab>
</Tabs>

## <Icon icon="brackets-curly" size={32} color="#2F554D" />   JSON Schema Tool

<Tabs>
  <Tab title="AI Studio" icon="https://mintcdn.com/orqai/My16MDKJXrKALEHC/images/logos/ai-studio-round.svg?fit=max&auto=format&n=My16MDKJXrKALEHC&q=85&s=ac04dd509320d58ab9701cb6d6137733" width="100" height="100" data-path="images/logos/ai-studio-round.svg">
    Enforce structured output from the model using a full JSON Schema definition.

    <Steps>
      <Step title="Add a new Tool to a Project">
        Use the `+` button to add a new Entity to a [Project](/docs/projects/overview).

        <Frame caption="Select JSON Schema Tool">
          <img src="https://mintcdn.com/orqai/G4rM3xl_79XLicq-/images/tool-add.png?fit=max&auto=format&n=G4rM3xl_79XLicq-&q=85&s=da31a85741218831aac7aac827d27e44" alt="Tool Add" width="591" height="215" data-path="images/tool-add.png" />
        </Frame>
      </Step>

      <Step title="Enter Tool Details">
        Enter the main details of the tool:

        * **Key**, used by models to reference the tool
        * **Name**, used in the studio to find the tool
        * **Description**, used to describe the tool

                  <Warning>
                    Make the Description as precise as possible, it is used notably by [Agents](/docs/agents/overview) when looking up relevant tools for their tasks.
                  </Warning>

        <Frame caption="Configure all fields">
          <img src="https://mintcdn.com/orqai/jgYoTEfpq7TuJGM3/images/Screenshot2025-11-21at10.58.43.png?fit=max&auto=format&n=jgYoTEfpq7TuJGM3&q=85&s=087b184acbd2f41f02566b79c31e000d" alt="JSON Schema Tool configure" width="620" height="472" data-path="images/Screenshot2025-11-21at10.58.43.png" />
        </Frame>
      </Step>

      <Step title="Configure your JSON Schema Tool">
        JSON Schema Tools are defined using JSON.

        Here is an example of a JSON schema for a function `get_current_weather` that declares the fields `location (string)` and `unit (string)`:

        ```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
        {
          "type": "object",
          "properties": {
            "unit": {
              "type": "string",
              "description": "The temperature unit, e.g. Celsius"
            },
            "location": {
              "type": "string",
              "description": "The city and state, e.g. San Francisco, CA"
            }
          },
          "required": [
            "location",
            "unit"
          ]
        }
        ```

        <Info>
          The object defined here is based on [JSON Schema](https://json-schema.org/). This framework allows for extensible definition that fit your ideal function definition.
        </Info>

        **Type**

        Use here any of the valid JSON types: `object`, `string`, `integer`, `number`, `array`, etc. The top-level type will most commonly be an `object` holding other properties.

        Learn more about all JSON types in [the JSON Schema definition](https://json-schema.org/understanding-json-schema/reference/type).

        **Properties**

        Properties are definitions of fields within an object. Here you can define any new variable. Nested properties are allowed.

        **Required**

        The `required` array within an object defines which fields must be entered for a JSON payload to be validated.
      </Step>

      <Step title="Publish your Tool">
        Once your tool is configured, click **Publish** to save a new version. Each published version is immutable and tracked in the [version history](#versions).
      </Step>
    </Steps>
  </Tab>

  <Tab title="API & SDK" icon="code">
    A JSON Schema Tool enforces structured output from the model using a full JSON Schema definition. Unlike Function Tools, the schema is defined at the top level with a `name` and `description`.

    | Field                     | Required | Description                                            |
    | ------------------------- | -------- | ------------------------------------------------------ |
    | `key`                     | Yes      | Unique identifier (alphanumeric, hyphens, underscores) |
    | `path`                    | Yes      | Project path, e.g. `"Default"`                         |
    | `type`                    | Yes      | Must be `"json_schema"`                                |
    | `description`             | Yes      | Used by agents to decide when and how to call the tool |
    | `display_name`            | No       | Human-readable name shown in the Studio                |
    | `json_schema.name`        | Yes      | Schema name                                            |
    | `json_schema.description` | No       | Describes the schema's purpose                         |
    | `json_schema.schema`      | Yes      | JSON Schema object enforcing the output structure      |

    <CodeGroup>
      ```bash cURL theme={"theme":{"light":"github-light","dark":"github-dark"}}
      curl -X POST https://api.orq.ai/v2/tools \
        -H "Authorization: Bearer $ORQ_API_KEY" \
        -H "Content-Type: application/json" \
        -d '{
          "key": "extract_contact",
          "display_name": "Extract Contact",
          "description": "Extracts contact information from unstructured text",
          "path": "Default",
          "type": "json_schema",
          "json_schema": {
            "name": "extract_contact",
            "description": "Extracts name, email, and phone from text",
            "schema": {
              "type": "object",
              "properties": {
                "name": { "type": "string" },
                "email": { "type": "string" },
                "phone": { "type": "string" }
              },
              "required": ["name"]
            }
          }
        }'
      ```

      ```python Python theme={"theme":{"light":"github-light","dark":"github-dark"}}
      from orq_ai_sdk import Orq
      import os

      orq = Orq(api_key=os.environ["ORQ_API_KEY"])

      tool = orq.tools.create(request={
          "key": "extract_contact",
          "display_name": "Extract Contact",
          "description": "Extracts contact information from unstructured text",
          "path": "Default",
          "type": "json_schema",
          "json_schema": {
              "name": "extract_contact",
              "description": "Extracts name, email, and phone from text",
              "schema": {
                  "type": "object",
                  "properties": {
                      "name": {"type": "string"},
                      "email": {"type": "string"},
                      "phone": {"type": "string"},
                  },
                  "required": ["name"],
              },
          },
      })
      ```

      ```typescript Node theme={"theme":{"light":"github-light","dark":"github-dark"}}
      import { Orq } from "@orq-ai/node";

      const orq = new Orq({ apiKey: process.env["ORQ_API_KEY"] ?? "" });

      const tool = await orq.tools.create({
        key: "extract_contact",
        displayName: "Extract Contact",
        description: "Extracts contact information from unstructured text",
        path: "Default",
        type: "json_schema",
        jsonSchema: {
          name: "extract_contact",
          description: "Extracts name, email, and phone from text",
          schema: {
            type: "object",
            properties: {
              name: { type: "string" },
              email: { type: "string" },
              phone: { type: "string" },
            },
            required: ["name"],
          },
        },
      });
      ```
    </CodeGroup>

    <Tip>See the full [Create Tool API reference](/reference/tools/create-tool).</Tip>
  </Tab>
</Tabs>

## <Icon icon="globe" size={32} color="#2F554D" />   HTTP Tool

<Tabs>
  <Tab title="AI Studio" icon="https://mintcdn.com/orqai/My16MDKJXrKALEHC/images/logos/ai-studio-round.svg?fit=max&auto=format&n=My16MDKJXrKALEHC&q=85&s=ac04dd509320d58ab9701cb6d6137733" width="100" height="100" data-path="images/logos/ai-studio-round.svg">
    Make a real HTTP request to an external API at runtime. Use `{{variable}}` syntax to inject dynamic values into any field.

    <Steps>
      <Step title="Add a new Tool to a Project">
        Use the `+` button to add a new Entity to a [Project](/docs/projects/overview).

        <Frame caption="Select HTTP Tool">
          <img src="https://mintcdn.com/orqai/G4rM3xl_79XLicq-/images/tool-add.png?fit=max&auto=format&n=G4rM3xl_79XLicq-&q=85&s=da31a85741218831aac7aac827d27e44" alt="Tool Add" width="591" height="215" data-path="images/tool-add.png" />
        </Frame>
      </Step>

      <Step title="Enter Tool Details">
        Enter the main details of the tool:

        * **Key**, used by models to reference the tool
        * **Name**, used in the studio to find the tool
        * **Description**, used to describe the tool

                  <Warning>
                    Make the Description as precise as possible, it is used notably by [Agents](/docs/agents/overview) when looking up relevant tools for their tasks.
                  </Warning>

        <Frame caption="Configure all fields">
          <img src="https://mintcdn.com/orqai/G4rM3xl_79XLicq-/images/http_tool_add.png?fit=max&auto=format&n=G4rM3xl_79XLicq-&q=85&s=541760b24922dbfdafd2b5d2a48d932a" alt="Http Tool Add Pn" width="614" height="474" data-path="images/http_tool_add.png" />
        </Frame>
      </Step>

      <Step title="Configure your HTTP Tool">
        HTTP Tools are defined within the Studio, either using the UI or using JSON (use the toggle to change mode).

        <Frame caption="Configure your HTTP Tool">
          <img src="https://mintcdn.com/orqai/G4rM3xl_79XLicq-/images/http-tool-configuration.png?fit=max&auto=format&n=G4rM3xl_79XLicq-&q=85&s=bf6d15cb22f28f22858b30bcf90768e5" alt="Http Tool Configuration Pn" width="1442" height="786" data-path="images/http-tool-configuration.png" />
        </Frame>

        | Field              | Description                                                                                        |
        | ------------------ | -------------------------------------------------------------------------------------------------- |
        | **URL**            | Enter the API URL as well as the HTTP Method for the call                                          |
        | **Header**         | Define Request Header Key-value pairs                                                              |
        | **Payload**        | Define Request Body Payload Key-value pairs (these are translated to JSON at runtime)              |
        | **Authentication** | Define an optional Bearer Authentication field and Token (Tokens are encrypted when saved in Orq). |

        You can use **Variables** with the `{{variable}}` syntax within any configuration field. The variable will be resolved at runtime when the payload is built for the HTTP call.

        <Note>
          Use the `Autogenerate Schema` when using variables to ensure variable definition is correctly created.
        </Note>
      </Step>

      <Step title="Publish your Tool">
        Once your tool is configured, click **Publish** to save a new version. Each published version is immutable and tracked in the [version history](#versions).
      </Step>
    </Steps>
  </Tab>

  <Tab title="API & SDK" icon="code">
    An HTTP Tool makes a real HTTP request to an external API at runtime. Use `{{variable}}` syntax in any field to inject dynamic values.

    | Field                      | Required | Description                                            |
    | -------------------------- | -------- | ------------------------------------------------------ |
    | `key`                      | Yes      | Unique identifier (alphanumeric, hyphens, underscores) |
    | `path`                     | Yes      | Project path, e.g. `"Default"`                         |
    | `type`                     | Yes      | Must be `"http"`                                       |
    | `description`              | Yes      | Used by agents to decide when and how to call the tool |
    | `display_name`             | No       | Human-readable name shown in the Studio                |
    | `http.blueprint.url`       | Yes      | Target URL. Supports `{{variable}}` syntax             |
    | `http.blueprint.method`    | Yes      | HTTP method: `GET`, `POST`, `PUT`, `PATCH`, `DELETE`   |
    | `http.blueprint.headers`   | No       | Key-value pairs sent with every request                |
    | `http.blueprint.arguments` | No       | Parameters the model can fill in at call time          |

    <CodeGroup>
      ```bash cURL theme={"theme":{"light":"github-light","dark":"github-dark"}}
      curl -X POST https://api.orq.ai/v2/tools \
        -H "Authorization: Bearer $ORQ_API_KEY" \
        -H "Content-Type: application/json" \
        -d '{
          "key": "search_products",
          "display_name": "Search Products",
          "description": "Searches the product catalog by keyword",
          "path": "Default",
          "type": "http",
          "http": {
            "blueprint": {
              "url": "https://api.example.com/products/search",
              "method": "GET",
              "headers": {
                "Accept": "application/json"
              },
              "arguments": {
                "query": {
                  "type": "string",
                  "description": "Search keyword",
                  "send_to_model": true
                }
              }
            }
          }
        }'
      ```

      ```python Python theme={"theme":{"light":"github-light","dark":"github-dark"}}
      from orq_ai_sdk import Orq
      import os

      orq = Orq(api_key=os.environ["ORQ_API_KEY"])

      tool = orq.tools.create(request={
          "key": "search_products",
          "display_name": "Search Products",
          "description": "Searches the product catalog by keyword",
          "path": "Default",
          "type": "http",
          "http": {
              "blueprint": {
                  "url": "https://api.example.com/products/search",
                  "method": "GET",
                  "headers": {"Accept": "application/json"},
                  "arguments": {
                      "query": {
                          "type": "string",
                          "description": "Search keyword",
                          "send_to_model": True,
                      }
                  },
              }
          },
      })
      ```

      ```typescript Node theme={"theme":{"light":"github-light","dark":"github-dark"}}
      import { Orq } from "@orq-ai/node";

      const orq = new Orq({ apiKey: process.env["ORQ_API_KEY"] ?? "" });

      const tool = await orq.tools.create({
        key: "search_products",
        displayName: "Search Products",
        description: "Searches the product catalog by keyword",
        path: "Default",
        type: "http",
        http: {
          blueprint: {
            url: "https://api.example.com/products/search",
            method: "GET",
            headers: { Accept: "application/json" },
            arguments: {
              query: {
                type: "string",
                description: "Search keyword",
                sendToModel: true,
              },
            },
          },
        },
      });
      ```
    </CodeGroup>

    <Tip>See the full [Create Tool API reference](/reference/tools/create-tool).</Tip>
  </Tab>
</Tabs>

## <Icon icon="https://mintcdn.com/orqai/i7ZhKI7LFRfXU7ox/images/logos/mcp.svg?fit=max&auto=format&n=i7ZhKI7LFRfXU7ox&q=85&s=cef7916eb5fe1f6bb97541398d3f7639" size={32} color="#2F554D" width="16" height="16" data-path="images/logos/mcp.svg" />   MCP Tool

<Tabs>
  <Tab title="AI Studio" icon="https://mintcdn.com/orqai/My16MDKJXrKALEHC/images/logos/ai-studio-round.svg?fit=max&auto=format&n=My16MDKJXrKALEHC&q=85&s=ac04dd509320d58ab9701cb6d6137733" width="100" height="100" data-path="images/logos/ai-studio-round.svg">
    Connect to a [Model Context Protocol](https://modelcontextprotocol.io) server. **Orq.ai** discovers available tools automatically. Provide an optional Bearer token for private servers.

    <Steps>
      <Step title="Add a new Tool to a Project">
        Use the `+` button to add a new Entity to a [Project](/docs/projects/overview).

        <Frame caption="Select MCP Tool">
          <img src="https://mintcdn.com/orqai/G4rM3xl_79XLicq-/images/tool-add.png?fit=max&auto=format&n=G4rM3xl_79XLicq-&q=85&s=da31a85741218831aac7aac827d27e44" alt="Tool Add" width="591" height="215" data-path="images/tool-add.png" />
        </Frame>
      </Step>

      <Step title="Enter Tool Details">
        Enter the main details of the tool:

        * **Key**, used by models to reference the tool
        * **Name**, used in the studio to find the tool
        * **Description**, used to describe the tool

                  <Warning>
                    Make the Description as precise as possible, it is used notably by [Agents](/docs/agents/overview) when looking up relevant tools for their tasks.
                  </Warning>
        * **MCP Server URL**, a valid MCP server endpoint
        * **Header**, key-value pairs sent with every request to the MCP server. Use `{{variable}}` syntax for sensitive values such as API keys.

        <Frame caption="Configure all fields">
          <img src="https://mintcdn.com/orqai/LWp7RZOlFHh-TZT5/images/create-mcp-tool.png?fit=max&auto=format&n=LWp7RZOlFHh-TZT5&q=85&s=23e2ce62c41e7ce761e277ffb5a9f972" alt="Create Mcp Tool Pn" width="614" height="1113" data-path="images/create-mcp-tool.png" />
        </Frame>

        **MCP Provider templates**

        Use the **MCP Provider** dropdown to select from a curated list of pre-configured providers. Selecting a provider pre-fills **Key**, **Name**, and **Headers** with the correct values for that provider, including any required authentication headers using `{{variable}}` placeholders.

        When template variables are detected, a prompt appears below the form asking for temporary values. These values are used only to connect to the MCP server and discover its available tools. They are not stored after the connection.

        <Frame caption="Select a provider to pre-fill connection details">
          <img src="https://mintcdn.com/orqai/c5ueP8k2ae8NnHKQ/images/mcp-templates.png?fit=max&auto=format&n=c5ueP8k2ae8NnHKQ&q=85&s=f757e4f9838e59af60364b0e207748d6" alt="MCP Provider Templates" width="617" height="553" data-path="images/mcp-templates.png" />
        </Frame>

        <Accordion title="View all supported providers" icon="list">
          | Provider                      | Server URL                                        |
          | ----------------------------- | ------------------------------------------------- |
          | Aiera                         | `https://mcp-pub.aiera.com/`                      |
          | Airtable                      | `https://mcp.airtable.com/mcp`                    |
          | Airwallex Developer           | `https://mcp-demo.airwallex.com/developer`        |
          | Amplitude                     | `https://mcp.amplitude.com/mcp`                   |
          | Apollo.io                     | `https://mcp.apollo.io/mcp`                       |
          | Asana                         | `https://mcp.asana.com/v2/mcp`                    |
          | Atlassian Rovo                | `https://mcp.atlassian.com/v1/mcp`                |
          | Attio                         | `https://mcp.attio.com/mcp`                       |
          | Aura                          | `https://mcp.auraintelligence.com/mcp`            |
          | AWS Marketplace               | `https://marketplace-mcp.us-east-1.api.aws/mcp`   |
          | Base44                        | `https://app.base44.com/mcp`                      |
          | Bigdata.com                   | `https://mcp.bigdata.com/`                        |
          | BioRender                     | `https://mcp.services.biorender.com/mcp`          |
          | Bitly                         | `https://api-ssl.bitly.com/v4/mcp`                |
          | Box                           | `https://mcp.box.com`                             |
          | Brex                          | `https://api.brex.com/mcp`                        |
          | Calendly                      | `https://mcp.calendly.com`                        |
          | Campfire                      | `https://api.meetcampfire.com/mcp`                |
          | Candid                        | `https://mcp.candid.org/mcp`                      |
          | Canva                         | `https://mcp.canva.com/mcp`                       |
          | CB Insights                   | `https://mcp.cbinsights.com`                      |
          | CData Connect AI              | `https://mcp.cloud.cdata.com/mcp`                 |
          | Chronograph                   | `https://ai.chronograph.pe/mcp`                   |
          | Circleback                    | `https://app.circleback.ai/api/mcp`               |
          | Clarify                       | `https://api.clarify.ai/mcp`                      |
          | Clay                          | `https://api.clay.com/v3/mcp`                     |
          | ClickUp                       | `https://mcp.clickup.com/mcp`                     |
          | Close                         | `https://mcp.close.com/mcp`                       |
          | Cloudflare Developer Platform | `https://bindings.mcp.cloudflare.com/mcp`         |
          | Cloudinary                    | `https://asset-management.mcp.cloudinary.com/sse` |
          | Common Room                   | `https://mcp.commonroom.io/mcp`                   |
          | Consensus                     | `https://mcp.consensus.app/mcp`                   |
          | Context7                      | `https://mcp.context7.com/mcp`                    |
          | Coupler.io                    | `https://mcp.coupler.io/mcp/`                     |
          | Craft                         | `https://mcp.craft.do/my/mcp`                     |
          | Crossbeam                     | `https://mcp.crossbeam.com`                       |
          | Daloopa                       | `https://mcp.daloopa.com/server/mcp`              |
          | Day AI                        | `https://day.ai/api/mcp`                          |
          | DevRev                        | `https://api.devrev.ai/mcp/v1`                    |
          | DocuSeal                      | `https://docuseal.com/mcp`                        |
          | Docusign                      | `https://mcp.docusign.com/mcp`                    |
          | Egnyte                        | `https://mcp-server.egnyte.com/mcp`               |
          | Enterpret Wisdom              | `https://wisdom-api.enterpret.com/server/mcp`     |
          | Exa                           | `https://mcp.exa.ai/mcp`                          |
          | FactSet                       | `https://mcp.factset.com/content/v1`              |
          | Fellow\.ai                    | `https://fellow.app/mcp`                          |
          | Fever Event Discovery         | `https://data-search.apigw.feverup.com/mcp`       |
          | Figma                         | `https://mcp.figma.com/mcp`                       |
          | Fireflies                     | `https://api.fireflies.ai/mcp`                    |
          | Fiscal.ai                     | `https://api.fiscal.ai/mcp/sse`                   |
          | G2                            | `https://mcp.g2.com/mcp`                          |
          | Gainsight (Staircase AI)      | `https://mcp.staircase.ai/mcp`                    |
          | Gamma                         | `https://mcp.gamma.app/mcp`                       |
          | GitHub                        | `https://api.githubcopilot.com/mcp/`              |
          | Google Cloud BigQuery         | `https://bigquery.googleapis.com/mcp`             |
          | Google Compute Engine         | `https://compute.googleapis.com/mcp`              |
          | Granola                       | `https://mcp.granola.ai/mcp`                      |
          | Guru                          | `https://mcp.api.getguru.com/mcp`                 |
          | Gusto                         | `https://mcp.api.gusto.com/anthropic`             |
          | Harvey                        | `https://api.harvey.ai/hosted_mcp/mcp`            |
          | Honeycomb                     | `https://mcp.honeycomb.io/mcp`                    |
          | HubSpot                       | `https://mcp.hubspot.com/anthropic`               |
          | Hugging Face                  | `https://huggingface.co/mcp`                      |
          | IFTTT                         | `https://ifttt.com/mcp`                           |
          | Indeed                        | `https://mcp.indeed.com/claude/mcp`               |
          | Intercom                      | `https://mcp.intercom.com/mcp`                    |
          | Intuit Credit Karma           | `https://anthropic.mcp.creditkarma.com/mcp`       |
          | Intuit Mailchimp              | `https://ai-inc.mailchimp.com/claude/mcp/v2`      |
          | Jam                           | `https://mcp.jam.dev/mcp`                         |
          | Jentic                        | `https://api.jentic.com/mcp`                      |
          | Jotform                       | `https://mcp.jotform.com/mcp-app`                 |
          | Klaviyo                       | `https://mcp.klaviyo.com/mcp`                     |
          | Krisp                         | `https://mcp.krisp.ai/mcp`                        |
          | LegalZoom                     | `https://www.legalzoom.com/mcp/claude/v1`         |
          | Lilt                          | `https://mcp.lilt.com/mcp`                        |
          | Linear                        | `https://mcp.linear.app/mcp`                      |
          | Local Falcon                  | `https://mcp.localfalcon.com`                     |
          | Lorikeet                      | `https://api.lorikeetcx.ai/v1/mcp`                |
          | LSEG                          | `https://api.analytics.lseg.com/lfa/mcp`          |
          | Lucid                         | `https://mcp.lucid.app/mcp`                       |
          | Lumin                         | `https://mcp.luminpdf.com/mcp`                    |
          | LunarCrush                    | `https://lunarcrush.ai/mcp`                       |
          | Magic Patterns                | `https://mcp.magicpatterns.com/mcp`               |
          | MailerLite                    | `https://mcp.mailerlite.com/mcp`                  |
          | Make                          | `https://mcp.make.com`                            |
          | Medidata                      | `https://mcp.imedidata.com/mcp`                   |
          | Melon                         | `https://mcp.melon.com/mcp/`                      |
          | Mem                           | `https://mcp.mem.ai/mcp`                          |
          | Mercury                       | `https://mcp.mercury.com/mcp`                     |
          | Metaview                      | `https://mcp.metaview.ai/mcp`                     |
          | Miro                          | `https://mcp.miro.com/`                           |
          | Mixpanel                      | `https://mcp.mixpanel.com/mcp`                    |
          | monday.com                    | `https://mcp.monday.com/mcp`                      |
          | Moody's                       | `https://api.moodys.com/genai-ready-data/m1/mcp`  |
          | Morningstar                   | `https://mcp.morningstar.com/mcp`                 |
          | MotherDuck                    | `https://api.motherduck.com/mcp`                  |
          | MSCI                          | `https://mcp.msci.com/mcp/v1.0/mcp`               |
          | MT Newswires                  | `https://vast-mcp.blueskyapi.com/mcp`             |
          | Netlify                       | `https://netlify-mcp.netlify.app/mcp`             |
          | Notion                        | `https://mcp.notion.com/mcp`                      |
          | Omni Analytics                | `https://callbacks.omniapp.co/callback/mcp`       |
          | Orq.ai                        | `https://my.orq.ai/v2/mcp`                        |
          | Outreach                      | `https://api.outreach.io/mcp/`                    |
          | Owkin                         | `https://mcp.k.owkin.com/mcp`                     |
          | PagerDuty                     | `https://mcp.pagerduty.com/mcp`                   |
          | PayPal                        | `https://mcp.paypal.com/mcp`                      |
          | PitchBook Premium             | `https://premium.mcp.pitchbook.com/mcp`           |
          | Plaid Developer Tools         | `https://api.dashboard.plaid.com/mcp/sse`         |
          | PlanetScale                   | `https://mcp.pscale.dev/mcp/planetscale`          |
          | PostHog                       | `https://mcp.posthog.com/mcp`                     |
          | Postman                       | `https://mcp.postman.com/minimal`                 |
          | Process Street                | `https://mcp.process.st`                          |
          | Pylon                         | `https://mcp.usepylon.com/`                       |
          | Quartr                        | `https://mcp.quartr.com/mcp`                      |
          | Ramp                          | `https://ramp-mcp-remote.ramp.com/mcp`            |
          | Razorpay                      | `https://mcp.razorpay.com/mcp`                    |
          | S\&P Global                   | `https://kfinance.kensho.com/integrations/mcp`    |
          | Sanity                        | `https://mcp.sanity.io`                           |
          | Scholar Gateway               | `https://connector.scholargateway.ai/mcp`         |
          | Sentry                        | `https://mcp.sentry.dev/mcp`                      |
          | SignNow                       | `https://mcp-server.signnow.com/mcp`              |
          | Similarweb                    | `https://mcp.similarweb.com`                      |
          | Slack                         | `https://mcp.slack.com/mcp`                       |
          | Square                        | `https://mcp.squareup.com/sse`                    |
          | Stripe                        | `https://mcp.stripe.com`                          |
          | Stytch                        | `https://mcp.stytch.dev/mcp`                      |
          | Supabase                      | `https://mcp.supabase.com/mcp`                    |
          | Supermetrics                  | `https://mcp.supermetrics.com/mcp`                |
          | Synapse.org                   | `https://mcp.synapse.org/mcp`                     |
          | Tango                         | `https://govcon.dev/mcp`                          |
          | Tavily                        | `https://mcp.tavily.com/mcp`                      |
          | Ticket Tailor                 | `https://mcp.tickettailor.ai/mcp`                 |
          | Udemy Business                | `https://api.udemy.com/mcp`                       |
          | Vercel                        | `https://mcp.vercel.com/`                         |
          | Webflow                       | `https://mcp.webflow.com/mcp`                     |
          | Windsor.ai                    | `https://mcp.windsor.ai`                          |
          | Wix                           | `https://mcp.wix.com/mcp`                         |
          | Yardi Virtuoso                | `https://mcp.virtuoso.ai/mcp`                     |
          | Zapier                        | `https://mcp.zapier.com/api/v1/connect`           |
          | Zocks                         | `https://mcp.zocks.io/v1/mcp`                     |
          | ZoomInfo                      | `https://mcp.zoominfo.com/mcp`                    |
        </Accordion>
      </Step>

      <Step title="View your MCP configuration">
        MCP Tools are automatically configured, you can then visualize all the capabilities and actions dynamically fetched from the MCP Server. Use the <Icon icon="minus-circle" /> **button** to remove a tool from the list.

        Use the **Refresh** button to fetch a new configuration.

        <Frame caption="View MCP Tool Actions">
          <img src="https://mintcdn.com/orqai/i7ZhKI7LFRfXU7ox/images/mcp-tools.png?fit=max&auto=format&n=i7ZhKI7LFRfXU7ox&q=85&s=2f5be2c12dba517d9f23242f048b6a8e" alt="Mcp Tools Pn" width="1529" height="971" data-path="images/mcp-tools.png" />
        </Frame>
      </Step>
    </Steps>
  </Tab>

  <Tab title="API & SDK" icon="code">
    An MCP Tool connects to an external [Model Context Protocol](https://modelcontextprotocol.io) server. **Orq.ai** fetches the available capabilities from the server automatically. The server URL must be reachable at creation time.

    For private MCP servers, use the `headers` field to pass authentication tokens. Header values are stored securely when `encrypted` is set to `true`.

    | Field                 | Required | Description                                                                          |
    | --------------------- | -------- | ------------------------------------------------------------------------------------ |
    | `key`                 | Yes      | Unique identifier (alphanumeric, hyphens, underscores)                               |
    | `path`                | Yes      | Project path, e.g. `"Default"`                                                       |
    | `type`                | Yes      | Must be `"mcp"`                                                                      |
    | `description`         | Yes      | Used by agents to decide when and how to call the tool                               |
    | `display_name`        | No       | Human-readable name shown in the Studio                                              |
    | `mcp.server_url`      | Yes      | HTTPS endpoint of the MCP server                                                     |
    | `mcp.connection_type` | No       | `"http"` (default) or `"sse"`                                                        |
    | `mcp.headers`         | No       | HTTP headers sent with every request. Mark sensitive values with `"encrypted": true` |

    <CodeGroup>
      ```bash cURL theme={"theme":{"light":"github-light","dark":"github-dark"}}
      curl -X POST https://api.orq.ai/v2/tools \
        -H "Authorization: Bearer $ORQ_API_KEY" \
        -H "Content-Type: application/json" \
        -d '{
          "key": "orq_docs_mcp",
          "display_name": "Orq Docs MCP",
          "description": "Search Orq.ai documentation and get integration guidance",
          "path": "Default",
          "type": "mcp",
          "mcp": {
            "server_url": "https://docs.orq.ai/mcp",
            "connection_type": "http",
            "headers": {
              "Authorization": { "value": "Bearer $MY_TOKEN", "encrypted": true }
            }
          }
        }'
      ```

      ```python Python theme={"theme":{"light":"github-light","dark":"github-dark"}}
      from orq_ai_sdk import Orq
      import os

      orq = Orq(api_key=os.environ["ORQ_API_KEY"])

      tool = orq.tools.create(request={
          "key": "orq_docs_mcp",
          "display_name": "Orq Docs MCP",
          "description": "Search Orq.ai documentation and get integration guidance",
          "path": "Default",
          "type": "mcp",
          "mcp": {
              "server_url": "https://docs.orq.ai/mcp",
              "connection_type": "http",
              "headers": {"Authorization": {"value": "Bearer $MY_TOKEN", "encrypted": True}},
          },
      })
      ```

      ```typescript Node theme={"theme":{"light":"github-light","dark":"github-dark"}}
      import { Orq } from "@orq-ai/node";

      const orq = new Orq({ apiKey: process.env["ORQ_API_KEY"] ?? "" });

      const tool = await orq.tools.create({
        key: "orq_docs_mcp",
        displayName: "Orq Docs MCP",
        description: "Search Orq.ai documentation and get integration guidance",
        path: "Default",
        type: "mcp",
        mcp: {
          serverUrl: "https://docs.orq.ai/mcp",
          connectionType: "http",
          headers: { Authorization: { value: "Bearer $MY_TOKEN", encrypted: true } },
        },
      });
      ```
    </CodeGroup>

    <Tip>See the full [Create Tool API reference](/reference/tools/create-tool).</Tip>
  </Tab>
</Tabs>

## <Icon icon="python" size={32} color="#2F554D" />   Python Tool

<Tabs>
  <Tab title="AI Studio" icon="https://mintcdn.com/orqai/My16MDKJXrKALEHC/images/logos/ai-studio-round.svg?fit=max&auto=format&n=My16MDKJXrKALEHC&q=85&s=ac04dd509320d58ab9701cb6d6137733" width="100" height="100" data-path="images/logos/ai-studio-round.svg">
    Run arbitrary Python code at runtime. Access parameters via `params` and store the result in `result`.

    <Steps>
      <Step title="Add a new Tool to a Project">
        Use the `+` button to add a new Entity to a [Project](/docs/projects/overview).

        <Frame caption="Select Python Tool">
          <img src="https://mintcdn.com/orqai/G4rM3xl_79XLicq-/images/tool-add.png?fit=max&auto=format&n=G4rM3xl_79XLicq-&q=85&s=da31a85741218831aac7aac827d27e44" alt="Tool Add" width="591" height="215" data-path="images/tool-add.png" />
        </Frame>
      </Step>

      <Step title="Enter Tool Details">
        Enter the main details of the tool:

        * **Key**, used by models to reference the tool
        * **Name**, used in the studio to find the tool
        * **Description**, used to describe the tool

                  <Warning>
                    Make the Description as precise as possible, it is used notably by [Agents](/docs/agents/overview) when looking up relevant tools for their tasks.
                  </Warning>

        <Frame caption="Configure all fields">
          <img src="https://mintcdn.com/orqai/Jlx8Xbh8UnD0ggfO/images/create-python-tool.png?fit=max&auto=format&n=Jlx8Xbh8UnD0ggfO&q=85&s=02a762a4abecd74cc77d1136975abd12" alt="Create Python Tool" width="619" height="471" data-path="images/create-python-tool.png" />
        </Frame>
      </Step>

      <Step title="Configure your Python Tool">
        Freely define the code to be ran during Tool execution.

        You can define the JSON Schema for the parameters to be sent into the tool. Here, see the `name` field defined and then further fetched using `params.get('name')`.

        Ensure your return value is stored within the `result` field.

        <Frame caption="Configure your Python Tool">
          <img src="https://mintcdn.com/orqai/G4rM3xl_79XLicq-/images/python-tool-config.png?fit=max&auto=format&n=G4rM3xl_79XLicq-&q=85&s=23daa8b74142e81e0089be9f675f6948" alt="Python Tool Config" width="1425" height="1188" data-path="images/python-tool-config.png" />
        </Frame>
      </Step>

      <Step title="Publish your Tool">
        Once your tool is configured, click **Publish** to save a new version. Each published version is immutable and tracked in the [version history](#versions).
      </Step>
    </Steps>
  </Tab>

  <Tab title="API & SDK" icon="code">
    A Python Tool runs Python code at runtime. Define the logic directly in the `code` field and declare expected parameters using a JSON Schema.

    | Field                  | Required | Description                                                                          |
    | ---------------------- | -------- | ------------------------------------------------------------------------------------ |
    | `key`                  | Yes      | Unique identifier (alphanumeric, hyphens, underscores)                               |
    | `path`                 | Yes      | Project path, e.g. `"Default"`                                                       |
    | `type`                 | Yes      | Must be `"code"`                                                                     |
    | `description`          | Yes      | Used by agents to decide when and how to call the tool                               |
    | `display_name`         | No       | Human-readable name shown in the Studio                                              |
    | `code_tool.language`   | Yes      | Must be `"python"`                                                                   |
    | `code_tool.code`       | Yes      | Python code to execute. Access parameters via `params`, store the result in `result` |
    | `code_tool.parameters` | Yes      | JSON Schema object describing the expected input parameters                          |

    <CodeGroup>
      ```bash cURL theme={"theme":{"light":"github-light","dark":"github-dark"}}
      curl -X POST https://api.orq.ai/v2/tools \
        -H "Authorization: Bearer $ORQ_API_KEY" \
        -H "Content-Type: application/json" \
        -d '{
          "key": "calculate_discount",
          "display_name": "Calculate Discount",
          "description": "Calculates the discounted price given a price and a discount percentage",
          "path": "Default",
          "type": "code",
          "code_tool": {
            "language": "python",
            "code": "price = float(params.get(\"price\", 0))\ndiscount = float(params.get(\"discount\", 0))\nresult = price * (1 - discount / 100)",
            "parameters": {
              "type": "object",
              "properties": {
                "price": { "type": "number", "description": "Original price" },
                "discount": { "type": "number", "description": "Discount percentage (0-100)" }
              },
              "required": ["price", "discount"]
            }
          }
        }'
      ```

      ```python Python theme={"theme":{"light":"github-light","dark":"github-dark"}}
      from orq_ai_sdk import Orq
      import os

      orq = Orq(api_key=os.environ["ORQ_API_KEY"])

      tool = orq.tools.create(request={
          "key": "calculate_discount",
          "display_name": "Calculate Discount",
          "description": "Calculates the discounted price given a price and a discount percentage",
          "path": "Default",
          "type": "code",
          "code_tool": {
              "language": "python",
              "code": (
                  'price = float(params.get("price", 0))\n'
                  'discount = float(params.get("discount", 0))\n'
                  "result = price * (1 - discount / 100)"
              ),
              "parameters": {
                  "type": "object",
                  "properties": {
                      "price": {"type": "number", "description": "Original price"},
                      "discount": {"type": "number", "description": "Discount percentage (0-100)"},
                  },
                  "required": ["price", "discount"],
              },
          },
      })
      ```

      ```typescript Node theme={"theme":{"light":"github-light","dark":"github-dark"}}
      import { Orq } from "@orq-ai/node";

      const orq = new Orq({ apiKey: process.env["ORQ_API_KEY"] ?? "" });

      const tool = await orq.tools.create({
        key: "calculate_discount",
        displayName: "Calculate Discount",
        description: "Calculates the discounted price given a price and a discount percentage",
        path: "Default",
        type: "code",
        codeTool: {
          language: "python",
          code: [
            'price = float(params.get("price", 0))',
            'discount = float(params.get("discount", 0))',
            "result = price * (1 - discount / 100)",
          ].join("\n"),
          parameters: {
            type: "object",
            properties: {
              price: { type: "number", description: "Original price" },
              discount: { type: "number", description: "Discount percentage (0-100)" },
            },
            required: ["price", "discount"],
          },
        },
      });
      ```
    </CodeGroup>

    <Tip>See the full [Create Tool API reference](/reference/tools/create-tool).</Tip>
  </Tab>
</Tabs>

## Versions

When you are done editing, click **Publish** to save your changes. You will be prompted to write a commit message and choose a version bump: **major**, **minor**, or **patch**.

<Frame caption="Publish a new version of your Tool">
  <img src="https://mintcdn.com/orqai/MD_M6y8_4NgpaNYp/images/tools-publish.png?fit=max&auto=format&n=MD_M6y8_4NgpaNYp&q=85&s=3e4a28a808f5e483a4a86f0952df2564" alt="Tool version publish" width="450" height="318" data-path="images/tools-publish.png" />
</Frame>

* **Patch** (e.g. `v1.0.0` to `v1.0.1`): small fixes, no behavior change
* **Minor** (e.g. `v1.0.0` to `v1.1.0`): new functionality, backwards compatible
* **Major** (e.g. `v1.0.0` to `v2.0.0`): breaking change or significant rework

Every time you publish, a new version of the tool is created. The **Versions** tab shows the full history. Versions are numbered (e.g. `v1.0.0`, `v1.1.0`) and each entry shows the author and publish timestamp.

<Frame caption="Version history in the Versions tab">
  <img src="https://mintcdn.com/orqai/MD_M6y8_4NgpaNYp/images/tools-versions.png?fit=max&auto=format&n=MD_M6y8_4NgpaNYp&q=85&s=dbb0af1f0109b4e56a689ec23242fa00" alt="Tool versions" width="361" height="434" data-path="images/tools-versions.png" />
</Frame>

Use the <Icon icon="right-left" /> **Compare** button to open a diff view to see what changed between versions.

## Using Tools

<AccordionGroup>
  <Accordion title="Agents" icon="robot">
    All tool types are supported. Reference a tool by `key` in the `settings.tools` array. Your agent's instructions must explicitly describe each tool and when to use it.

    <Tip>Learn more about [using tools in Agents](/docs/agents/agent-api#using-tools).</Tip>
  </Accordion>

  <Accordion title="Deployments" icon="rocket">
    Only **Function Tools** are supported. Import a previously created tool from the **Tools** tab in the deployment configuration.

    <Tip>Learn more about [using tools in Deployments](/docs/deployments/creating#tools).</Tip>
  </Accordion>
</AccordionGroup>
