How are integrations exposed to LLM agents?
MCP servers, function-calling schemas, SDKs per framework; tool search / dynamic tool loading.
Verdict
Both projects solve the problem of too many tools with discovery meta-tools, but they search in different ways. 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 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
answeredTwo 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.
aipotheosis-labs/aci
answeredIntegrations 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).
← How is an integration / connector defined? · How is a tool call executed? →