---
canonical: https://docs.jentic.com/reference/sdks/python/
representation: markdown-alternate
# Canonical page: https://docs.jentic.com/reference/sdks/python/
# This is the Markdown alternate of the page above.
title: "Jentic Python SDK — Search, Load, Execute APIs"
description: >-
  Reference for the Jentic Python SDK, a library for discovering and executing APIs and
  workflows with helpers to turn them into LLM tools, backed by public APIs.
---

# Python SDK (Beta)

!!! warning "Deprecated"
    This page is **deprecated** and kept only for reference. It describes a retired part of Jentic
    (the hosted `app.jentic.com` platform / the `jentic-sdks` library). The current, supported path
    is **self-hosted Jentic One** — see [Jentic One](../jentic-one/index.md).

The **Jentic Python SDK** is a comprehensive library for **discovering** and **executing** APIs and workflows, with helpers to **turn them into LLM tools**.

Backed by the data in **[Jentic Public APIs](https://github.com/jentic/jentic-public-apis)**.

---

## Install

```bash
pip install jentic
```

## Configure your key

Create an Agent API key in the app, then set:

```bash
export JENTIC_AGENT_API_KEY=<your-agent-api-key>
```

---

## Quick start: search → load → execute

```python
import asyncio
from jentic import Jentic, SearchRequest, LoadRequest, ExecutionRequest

async def main():
    client = Jentic()

    # 1) Search for a capability
    search = await client.search(SearchRequest(query="send a Discord DM"))
    entity_id = search.results[0].id          # op_... or wf_...

    # 2) Load details (inspect inputs / auth)
    load = await client.load(LoadRequest(ids=[entity_id]))
    inputs_schema = load.tool_info[entity_id].inputs
    print(inputs_schema)

    # 3) Execute
    result = await client.execute(
        ExecutionRequest(id=entity_id, inputs={"recipient_id": "123", "content": "Hello!"})
    )
    print(result)

asyncio.run(main())
```

> The snippet above corrects a small naming mismatch in the original README
> (`search` vs `results`) so you can copy/paste and run immediately.

---

## Use with LLM agents (tool definitions + execution)

```python
from jentic.lib.agent_runtime import AgentToolManager

# Generate LLM-compatible tool specs (OpenAI/Anthropic)
manager = AgentToolManager(format="anthropic")
tools = manager.generate_tool_definitions()   # pass to your LLM

# --- inside your agent loop, when a tool is requested ---
result = await manager.execute_tool(
    "discord_send_message",
    {"recipient_id": "123", "content": "Hi"}
)
print(result)
```

**What the runtime provides**

* Generate tool specs from Arazzo workflows & OpenAPI operations
* Execute workflows/operations via a unified interface
* Runtime classes:

  * `AgentToolManager` — tool lifecycle & execution
  * `LLMToolSpecManager` — tool specification generation
  * `TaskExecutor` — standardized execution results

---

## Dev install (optional)

```bash
# from the SDK repo
pip install -e .
```

Or reference it in another project:

```toml
# pyproject.toml
dependencies = [
  "jentic @ file:///path/to/jentic/sdk"
]
```

---

## Testing (optional)

```bash
# unit tests
pdm run test

# integration tests (dev)
pdm run integration-dev

# integration tests (prod)
pdm run integration
```

**Integration config**

```bash
# copy examples and edit with your creds/UUIDs
cp tests/integration/.env.example tests/integration/.env.dev
cp tests/integration/.env.example tests/integration/.env.prod
```

Examples of required values:

```
DISCORD_GET_MY_USER_OPERATION_UUID="op_xxx"
DISCORD_GET_USER_DETAILS_WORKFLOW_UUID="wf_xxx"
JENTIC_API_URL=https://<your-jentic-one-host>
DISCORD_BOT_TOKEN="your_bot_token_here"
```

---

## MCP plugin

Prefer MCP? Use the MCP server to expose the same capabilities to MCP clients (Windsurf, Claude Desktop, Cursor, ChatGPT). See the **Guides → MCP** section in the sidebar, starting with [Remote MCP (self-hosted)](../../guides/mcp/remote-mcp.md).