Building Agents

Tools

Built-in tools, Composio-powered external tools, and how to scope them per agent.

A tool is a capability an agent can invoke. Project88 ships built-in tools and exposes thousands more via Composio.

Built-in tools

Always available — no setup required:

ToolWhat it does
search_user_tablesQuery your data tables and their rows
search_pagesFind page content (block-level search)
list_agentsList the agents in the current org
get_current_timeReturns the current time in ISO 8601

Built-in tools run inside the chat-proxy Edge Function — they're fast, free of external rate limits, and never leave Supabase.

Composio tools

Every Composio toolkit you've connected exposes its tools to your agents automatically. The catalog has 900+ services. Common ones:

  • Gmail — search, fetch, send, label
  • Google Calendar — list events, create events
  • Outlook — calendar + mail
  • Slack — list channels, search messages, send messages
  • GitHub — list issues, create issues
  • Notion / Linear / Asana / Jira — and many more

When you connect a toolkit, the chat-proxy Edge Function fetches its tool definitions from Composio's REST API at request time, converts them to OpenAI function-calling schemas, and exposes them to the LLM.

The proxy also does several things to keep tool use reliable:

  • Schema sanitization — Composio sometimes returns property keys with spaces or other characters invalid in JSON schema (e.g. "Time Min"). The proxy rewrites them before passing to the LLM and reverses the mapping before invoking the tool.
  • Description overrides — for a handful of high-traffic tools (Gmail, Calendar, Outlook, Slack, GitHub) the proxy substitutes clearer, user-centric descriptions so the LLM picks them up reliably.
  • Connected-services hint — a system message at the start of every conversation lists the user's connected services and nudges the LLM to use the tools rather than refuse the request.
  • Tool count per toolkit is capped to keep the prompt focused — the exact number is tuned per release.

Scoping tools per agent

Each agent has a Tools tab with visual toggle switches grouped by category:

  • Built-in — the 4 built-in tools
  • Calendar & Email — Gmail, Outlook, Google Calendar
  • Communication — Slack
  • Development — GitHub
  • (your other connected toolkits appear in their own categories)

The toggles write to tools.allow (a list of allowed tool IDs) and tools.deny (a list of explicitly denied tool IDs). The proxy reads both at request time:

  • If allow is non-empty, only tools in allow are exposed.
  • Any tool in deny is removed regardless of allow.

Use deny to surgically remove a single dangerous tool from an otherwise broadly-scoped agent.

Explicit tool calls in pipelines

In an Agent's pipeline, drop a Tool Call node. You pick the tool, fill in its arguments (with bindable inputs — you can reference upstream node outputs, variables, and formula functions), and the node returns the result for downstream nodes to use.

This is how you get deterministic tool use — the LLM doesn't decide, your graph does.

Tool call visibility in chat

Every tool call shows up in the chat thread as a collapsible ToolCallsDisplay block with:

  • Tool name
  • Arguments (JSON)
  • Result preview

Tool calls are persisted to messages.metadata so they re-render exactly when you reload the conversation.

Where to next

On this page