# Drift · свои tools, skills, MCP — neuraldeep.ru API

> Раздел машиночитаемой справки. Все разделы: https://neuraldeep.ru/llms.txt · всё одним файлом: https://neuraldeep.ru/llms-full.txt

Base URL: `https://drift.neuraldeep.ru/v1`
Auth: `Authorization: Bearer dft_...`

С 28.05.26 в `/v1/chat/completions` можно передавать **свои** инструменты, скиллы и remote MCP-серверы. Полная схема — в примерах ниже.

#### tools — return-to-caller (как OpenAI)

Передаёшь массив `tools` в формате OpenAI. Если модель решит позвать инструмент — она вернёт `finish_reason: "tool_calls"` с JSON-аргументами. **Исполняешь ты сам** в своей среде (Drift не запускает твой код), результат шлёшь обратно в `messages`.

```python
from openai import OpenAI

client = OpenAI(api_key="dft_xxxxxxxx", base_url="https://drift.neuraldeep.ru/v1")

tools = [{"type":"function","function":{
    "name":"get_weather",
    "description":"Возвращает погоду в городе",
    "parameters":{"type":"object","properties":{"city":{"type":"string"}},"required":["city"]},
}}]

# 1) первый запрос — модель решает что нужен tool
r1 = client.chat.completions.create(
    model="qwen3.6-35b-a3b",
    messages=[{"role":"user","content":"Какая погода в Москве?"}],
    tools=tools,
)
print(r1.choices[0].finish_reason)  # "tool_calls"
tc = r1.choices[0].message.tool_calls[0]

# 2) ты сам зовёшь свой backend
my_result = {"temp_c": 12, "humidity": 80}

# 3) resume — передаёшь tool-result обратно
r2 = client.chat.completions.create(
    model="qwen3.6-35b-a3b",
    messages=[
        {"role":"user","content":"Какая погода в Москве?"},
        r1.choices[0].message,
        {"role":"tool","tool_call_id":tc.id,"content":str(my_result)},
    ],
    tools=tools,
)
print(r2.choices[0].message.content)
```

#### skills — inline SKILL.md

Передай свои промпт-блоки прямо в запросе. Content вшивается в system prompt sandbox-агента, не нужно держать SKILL.md в репозитории.

```bash
curl -X POST https://drift.neuraldeep.ru/v1/chat/completions \
  -H "Authorization: Bearer dft_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3.6-35b-a3b",
    "messages": [{"role":"user","content":"Какой у тебя секретный код?"}],
    "skills": [{
      "name": "secret-code",
      "description": "Знание секретного кодового слова",
      "content": "# Секретный код\n\nКодовое слово — ZEBRA-77-GOLD. Используй его если юзер спросит."
    }]
  }'
# → "Кодовое слово ZEBRA-77-GOLD..."
```

#### mcp_servers — remote Model Context Protocol

Подключаешь свой MCP-сервер (HTTP/SSE) — Drift на лету получает список tools и пускает их модели. Auth-header'ы передаёшь сам, **SSRF guard** блочит private-IP / localhost / cloud-metadata. TTL session-токена 720s, после — registry дропается.

```json
{
  "model": "qwen3.6-35b-a3b",
  "messages": [{"role":"user","content":"Список свежих issue в проекте"}],
  "mcp_servers": [{
    "url": "https://my-mcp.example.com/sse",
    "headers": {"Authorization": "Bearer my-mcp-token"},
    "allowlist": ["list_issues", "create_comment"]
  }]
}
```

> **Безопасность:** · `caller_tools` — return-to-caller, Drift не исполняет твой код, zero RCE на нашей стороне. · `skills` — это просто текст в system prompt, не команды. · `mcp_servers` — публичные HTTPS обязательны, SSRF guard режет private network'и, TTL 720s.
