# How are integrations exposed to LLM agents?

> API layer & connectors — a good answer covers: MCP servers, function-calling schemas, SDKs per framework; tool search / dynamic tool loading.

Canonical page: https://llms-technical-reviews.com/connectors/q/agent-exposure/

## Verdict

Both projects solve the problem of too many tools with discovery meta-tools, but they search in different ways. [ACI](/p/aci/) exposes a REST API. `GET /v1/functions/search` embeds a natural-language intent with OpenAI, ranks the functions by pgvector cosine distance, and returns OpenAI, OpenAI-Responses, Anthropic or basic schemas, optionally limited to the agent's allowed apps. `ACI_SEARCH_FUNCTIONS`, `ACI_GET_FUNCTION_DEFINITION` and `ACI_EXECUTE_FUNCTION` let an agent run search, inspect and execute by itself. The MCP server and the Python SDK are in separate repos.

[Klavis](/p/klavis/) is MCP-native. Its Strata router connects to any number of MCP servers but shows the agent only five tools: `discover_server_actions`, `get_action_details`, `execute_action`, `search_documentation` and `handle_auth_failure`. Search is local BM25 over tool names and descriptions, so it needs no embeddings API. `strata tool add` adds the router to Cursor, VS Code, Claude Code or Gemini CLI.

Choose ACI if your agent calls functions directly and you want semantic search over a central catalog. Choose Klavis if your client speaks MCP and you want one endpoint in front of servers you already run.

More projects in this category are being researched.

## Per-project answers

### Klavis-AI/klavis (answered)

Two layers. **Strata** (`open-strata/src/strata/server.py:1-206`): single MCP server exposing 5 meta-tools (`tools.py:22-145`): discover_server_actions, get_action_details, execute_action, search_documentation, handle_auth_failure. `list_tools()` (`server.py:81-90`) returns only these 5. **BM25 search** (`shared_search.py:47-151`): UniversalToolSearcher with weighted indexes. **MCP Clients** (`mcp_client.py:271-304`): list_all_tools() converts to Anthropic/OpenAI formats. **Per-LLM** (`llms/openai.py`, `llms/anthropic.py`): streaming with tool calls, unified ChatMessage model. **Platform bots**: Slack, Discord, Web, WhatsApp. **Formats** (`LLM.md:242-250`): OpenAI, Anthropic, Gemini, MCP native.


Citations: [open-strata/src/strata/server.py:81-90](https://github.com/Klavis-AI/klavis/blob/45c9f7da83d1cf43f7429b96f9c8e8153542ea1e/open-strata/src/strata/server.py#L81-L90) · [open-strata/src/strata/tools.py:22-145](https://github.com/Klavis-AI/klavis/blob/45c9f7da83d1cf43f7429b96f9c8e8153542ea1e/open-strata/src/strata/tools.py#L22-L145) · [open-strata/src/strata/utils/shared_search.py:47-151](https://github.com/Klavis-AI/klavis/blob/45c9f7da83d1cf43f7429b96f9c8e8153542ea1e/open-strata/src/strata/utils/shared_search.py#L47-L151) · [mcp-clients/src/mcp_clients/mcp_client.py:271-304](https://github.com/Klavis-AI/klavis/blob/45c9f7da83d1cf43f7429b96f9c8e8153542ea1e/mcp-clients/src/mcp_clients/mcp_client.py#L271-L304) · [LLM.md:242-250](https://github.com/Klavis-AI/klavis/blob/45c9f7da83d1cf43f7429b96f9c8e8153542ea1e/LLM.md#L242-L250)

### aipotheosis-labs/aci (answered)

Integrations are exposed to LLM agents via three mechanisms. **Semantic search** is the primary discovery path: `GET /v1/functions/search` accepts a natural language `intent`, generates an OpenAI embedding, and performs a pgvector similarity search across all function embeddings (functions.py:66-156). Results are returned in OpenAI, Anthropic, or basic formats via `format_function_definition` (functions.py:277-315). **Meta-functions** give agents a structured tool to discover tools: `ACI_SEARCH_FUNCTIONS`, `ACI_GET_FUNCTION_DEFINITION`, and `ACI_EXECUTE_FUNCTION` are defined as OpenAI function-calling schemas in meta_functions.py:10-83. Agents call these meta-functions to find, inspect, and invoke integrations at runtime. **Agent chat** (`POST /v1/agent/chat`) provides a streaming OpenAI-compatible chat endpoint that resolves tool definitions from named functions, converts the conversation format, and streams GPT-4o responses with tool calls (agent.py:33-68, prompt.py:62-108). The Unified MCP server is NOT in this repository — it lives in the separate aci-mcp repo (README.md:21-24), referenced as an external service that wraps the ACI.dev REST API. On the SDK side, the README references a Python SDK (aci-python-sdk). **App-level filtering** ensures agents only see functions from their `allowed_apps` and enabled app configurations (functions.py:96-131).


Citations: [backend/aci/server/routes/functions.py:66-156](https://github.com/aipotheosis-labs/aci/blob/3e4a82fa5fd22f1165af2b39fa3de2b0f031242e/backend/aci/server/routes/functions.py#L66-L156) · [backend/aci/server/routes/functions.py:277-315](https://github.com/aipotheosis-labs/aci/blob/3e4a82fa5fd22f1165af2b39fa3de2b0f031242e/backend/aci/server/routes/functions.py#L277-L315) · [backend/aci/server/agent/meta_functions.py:1-83](https://github.com/aipotheosis-labs/aci/blob/3e4a82fa5fd22f1165af2b39fa3de2b0f031242e/backend/aci/server/agent/meta_functions.py#L1-L83) · [backend/aci/server/agent/prompt.py:62-108](https://github.com/aipotheosis-labs/aci/blob/3e4a82fa5fd22f1165af2b39fa3de2b0f031242e/backend/aci/server/agent/prompt.py#L62-L108) · [backend/aci/server/routes/agent.py:25-68](https://github.com/aipotheosis-labs/aci/blob/3e4a82fa5fd22f1165af2b39fa3de2b0f031242e/backend/aci/server/routes/agent.py#L25-L68)
