One API key. 80+ tools. Any AI agent.
Open-source tool calling, OAuth, MCP, memory and flows for Claude, Cursor and your own LLM apps.
Quickstart · How it works · Integrations · Architecture · Contributing
VeyraX is an infrastructure layer that connects AI agents to the tools people actually use. One API key gives an agent (Claude, Cursor, your own LLM app) authenticated access to 80+ integrations and thousands of MCP servers, plus long-term memory and multi-step automation flows.
Tip
If VeyraX is useful to you, give it a ⭐. It helps other people find the project.
The agent calls a tool through VeyraX; VeyraX authenticates on behalf of the user, calls the underlying API and returns both structured data and a ready-to-render UI component.
![]() |
![]() |
![]() |
- Tool calling API — a single, uniform interface (
/tools,/tool-call/{tool}/{method}) over 80+ integrations: Gmail, Google Calendar/Drive/Docs/Sheets, Slack, Notion, Linear, Jira, Confluence, GitHub, Outlook, Dropbox, Asana, Trello, Figma, Airtable, Vercel, Sentry, PostgreSQL, ClickHouse, Snowflake, Perplexity, Tavily, Exa, Firecrawl, Browserbase, E2B and many more (seeaci_server/integrations). - OAuth & credential management — users connect their accounts once; tokens and API keys are stored encrypted (AES) and injected into tool calls on their behalf.
- MCP — expose all connected tools to MCP clients, and deploy any GitHub-hosted MCP server "in two clicks" (Dockerfile generation, build via GitHub Actions, push to Docker Hub).
- Memory — retain information automatically across user requests and make it available to any agent.
- Flows — describe a routine in natural language, turn it into an agent-powered multi-step workflow, run it on demand or on a schedule.
- Semantic tool search — vector index over tools and providers so agents can find the right tool.
- UI components — integrations return structured components (
component.json) that the frontend renders.
| Integrations catalog | Connect a tool |
|---|---|
![]() |
![]() |
| Deploy an MCP server from GitHub | Create a flow from a prompt |
![]() |
![]() |
| Memory | Flow overview & API |
![]() |
![]() |
| Auth for your users | Explore & deploy MCPs |
![]() |
![]() |
| Path | Description |
|---|---|
aci_server/ |
Python backend: FastAPI app, integrations, agent runtime (OpenAI Agents SDK / OpenRouter), flows, memory, MCP deployment, Celery workers |
aci_server/integrations/<name>/ |
One folder per integration: client.py, service.py, route.py, schema.py, examples.yaml, component.json, tests.py |
main/ |
Next.js 14 web app: landing, dashboard, integrations, playground, flows, settings, billing (Stripe) |
services/whatsapp-bridge/ |
Go service exposing WhatsApp through a REST API |
nginx/, docker-compose*.yml |
Deployment configuration (reverse proxy, Celery/Flower, Redis, Datadog) |
.github/workflows/ |
GitHub Action that builds and publishes MCP server images |
Main dependencies: Supabase (Postgres + Auth + Storage), Redis, Upstash Vector / Qdrant, OpenRouter (all LLM, embedding and
speech-to-text calls; models are set in aci_server/llm.py and main/lib/ai/openrouter.ts).
83 integrations live in aci_server/integrations; 79 of them are registered by default
and loaded into the tool catalog. Each one is exposed as /{integration}/{method} and through the unified
/tool-call/{tool}/{method} endpoint.
Auth: OAuth — user connects an account; API key — user's or server key; RapidAPI — key from RapidAPI; Credentials — host/user/password or connection string; None — public API.
Integrations marked with † are implemented but not registered in INTEGRATION_ROUTERS (aci_server/main.py).
Click a category below for what an agent can do with each integration.
Productivity & Docs (19)
| Integration | What an agent can do | Auth |
|---|---|---|
| Records CRUD, attachments, CSV sync, fields and tables | OAuth | |
| Tasks, subtasks, projects, tags, teams, workspaces | OAuth | |
| Bookings (create, reschedule, cancel), schedules, event types | API key | |
| Docs, pages, tables, columns and rows, page export | API key | |
| Spaces, pages CRUD, content search | OAuth | |
| Envelopes, documents, signing views | OAuth | |
| Files and folders: list, upload, download, move, share, search | OAuth | |
| Files, nodes, images, components, styles, team projects | OAuth | |
| Calendars and events CRUD | OAuth | |
| Create, read, edit and search documents | OAuth | |
| Files and folders, upload/download, permissions | OAuth | |
| Read/write/append values, sheets, formulas, search | OAuth | |
| Tasks, recurring tasks, projects, comments, schedules | API key | |
| Databases, pages, blocks, search, users | OAuth | |
| Save, list, update and delete Reader documents | API key | |
| Tasks and projects | OAuth | |
| Projects, sections, tasks, labels, comments | OAuth | |
| Boards, lists, cards, checklists, organizations | OAuth | |
| Forms, responses, webhooks, workspaces | API key |
Communication (6)
| Integration | What an agent can do | Auth |
|---|---|---|
| Read, send and delete messages, drafts | OAuth | |
| Any mailbox: read, send, folders, auto-detect server settings | Credentials | |
| Messages, drafts, calendars and events | OAuth | |
| Send emails (single/batch), broadcasts, domains, audiences, contacts | API key | |
| Channels, messages, DMs, threads | OAuth | |
| Chats, messages, contacts via the WhatsApp bridge | QR pairing |
Developer tools & Infrastructure (13)
| Integration | What an agent can do | Auth |
|---|---|---|
| Search UI components, generate component prompts | API key | |
| Run and control browser automation tasks | API key | |
| Headless browser sessions, contexts, logs, recordings | API key | |
| Code sandboxes: run code and commands, files | API key | |
| Repositories, issues, pull requests, commits, reviews | OAuth | |
| Issues CRUD, projects, statuses, transitions, users | OAuth | |
| Issues (search, create, update, comment), projects, teams | OAuth | |
| Workflows, executions, users, credentials, tags | API key | |
| HogQL queries, insights, dashboards, events, projects | API key | |
| Collections, environments, workspaces | API key | |
| Teams, projects, issues, releases, alert rules | OAuth | |
| File uploads (incl. from URL), file management | API key | |
| Projects, deployments, domains, environment variables | OAuth |
Databases (5)
| Integration | What an agent can do | Auth |
|---|---|---|
| Run queries, list tables and columns | Credentials | |
| Run queries, list tables and columns | Credentials | |
| Run queries, list tables and columns | Credentials | |
| Run queries, list tables and columns | Credentials | |
| Run queries, list tables and columns | Credentials |
Search & Web (7)
| Integration | What an agent can do | Auth |
|---|---|---|
| Web, image, video and news search | API key | |
| Search and fetch page content | None | |
| Neural search, page contents, similar pages | API key | |
| Scrape, crawl, map sites, structured extraction | API key | |
| Top/new/best stories, items, comments, users | None | |
| Web search and content extraction | API key | |
| Search videos, video details, captions, transcripts | API key |
AI & Media (7)
| Integration | What an agent can do | Auth |
|---|---|---|
| Generate images, videos, GIFs and collections from templates | API key | |
| Upload, transform, rename and delete assets | API key | |
| Discover and run generative models, queue status, uploads | API key | |
| Avatar videos, voices, templates, translation | API key | |
| Web-grounded chat completions | API key | |
| Run models, predictions, deployments, trainings | API key | |
| Generate and publish short-form videos | API key |
CRM & Sales (3)
| Integration | What an agent can do | Auth |
|---|---|---|
| Search people and organizations, get details | RapidAPI | |
| Businesses, calendars, slots, contacts and more | API key | |
| Domain search, email finder/verifier, enrichment | API key |
Social (5)
| Integration | What an agent can do | Auth |
|---|---|---|
| Search and read public pages, posts, groups, events | RapidAPI | |
| Profiles, posts, comments, followers | RapidAPI | |
| Profiles, companies, posts, jobs, people search | RapidAPI | |
| Read, post, comment, edit, vote, search | OAuth | |
| Profiles, timelines, tweets, threads, lists, search | RapidAPI |
Travel, Local & Real Estate (5)
| Integration | What an agent can do | Auth |
|---|---|---|
| Search listings, listing details | None | |
| Geocoding, places, directions, distance matrix, elevation | API key | |
| Flights (one-way, round-trip, anywhere), price calendars, hotels | RapidAPI | |
| Search businesses, details, reviews, menus | RapidAPI | |
| Properties, Zestimates, comps, market data | RapidAPI |
Commerce & Finance (4)
| Integration | What an agent can do | Auth |
|---|---|---|
| Product search, items, variations, browse nodes (PA-API) | API key | |
| P2P crypto offers | RapidAPI | |
| P2P crypto offers | RapidAPI | |
| P2P crypto offers | RapidAPI |
Utilities (6)
| Integration | What an agent can do | Auth |
|---|---|---|
| Short links (bulk too), QR codes, analytics, events | API key | |
| Call any HTTP endpoint | None | |
| IP geolocation (single/bulk), ASN info | API key | |
| Weather forecast | API key | |
| Search SVG brand logos by name or category | None | |
| Look up places by zip code or city | None |
VeyraX (3)
| Integration | What an agent can do | Auth |
|---|---|---|
| Save, get, update and delete user memories | VeyraX API key | |
| Tool connection status, connection links | VeyraX API key | |
| Search and deploy MCP servers, connection links | VeyraX API key |
You need Docker (running), the Supabase CLI and Node.js 18+. Then, from the repository root:
./quickstart.shOne command, safe to re-run. It:
- starts a local Supabase with the full schema and the tool catalog (79 integrations, ~930 actions);
- creates
.envandmain/.env.localfor it (existing files are kept); - starts the backend with Docker Compose and the frontend with Next.js;
- runs a smoke test: creates a demo user and an API key, connects Hacker News and calls a tool through the backend.
At the end it prints where everything runs:
| What | Where |
|---|---|
| App | http://localhost:3000, log in as demo@example.com / demo-password-123 |
| Backend API docs | http://localhost:8000/docs |
| Supabase Studio | http://127.0.0.1:54323 |
| Demo API key | printed, together with a ready-to-run curl tool call |
The first run takes a few minutes (Docker images, npm packages); later runs take under a minute. Stop everything with
./quickstart.sh stop; the database is kept.
- Tools with an API key or no auth work right away. The chat, agent and flows need an
OpenRouter key: run
OPENROUTER_API_KEY=... ./quickstart.shbefore.envexists, or add it to.envandmain/.env.locallater. - OAuth integrations (Slack, Notion, …) also need your own OAuth app credentials in
.env. - If another local Supabase project already uses the default ports, the script runs this one on ports 544xx and prints the actual URLs.
The sections below are the manual version of what ./quickstart.sh does.
- Docker and Docker Compose
- Node.js 18+ (for the frontend)
- Supabase CLI for a local database, or a hosted Supabase project
- An OpenRouter API key (every model call goes through OpenRouter)
The schema lives in supabase/migrations and the tool catalog (79 integrations, ~930 actions,
OAuth scopes) in supabase/seed.sql.
Local (recommended):
supabase start # first run pulls images; applies migrations + seed.sql
supabase status -o env # URLs and keys for the .env filesUse the legacy JWT keys from supabase status -o env: ANON_KEY and SERVICE_ROLE_KEY. The new sb_publishable_… /
sb_secret_… keys are rejected by the pinned supabase Python client. supabase db reset wipes the local database and
re-applies everything. Studio runs at http://127.0.0.1:54323.
port is already allocated means another local Supabase project uses the default ports: stop it with
supabase stop --project-id <name> (its data is kept), or see
Running multiple local projects.
Hosted Supabase project:
supabase link --project-ref <your-project-ref>
supabase db push --include-seedOr run the files from supabase/migrations/ (in order) and then supabase/seed.sql in the SQL Editor.
Plain PostgreSQL 15+ with psql (no Supabase, e.g. for a quick check or CI):
supabase/psql/test.sh # throwaway local cluster, removed afterwards (needs initdb 15+)
supabase/psql/test.sh postgresql://... # or an existing empty databaseIt applies supabase/psql/bootstrap.sql (the Supabase roles and auth helpers), then the
migrations and seed.sql twice to check idempotency. It finishes with RLS smoke checks run as anon, two users and
service_role, inside a transaction that is rolled back.
Billing views read Stripe data from a stripe schema. The baseline migration creates empty placeholder tables there; to
show real subscriptions, replace them with the Supabase Stripe Wrapper.
- Backend:
cp .env.example .envand fill in the REQUIRED section. - Frontend:
cp main/.env.example main/.env.localand fill in the REQUIRED section. - Never commit real
.envfiles — they are git-ignored.
With local Supabase the backend runs in Docker, so it reaches the database at http://host.docker.internal:54321.
The frontend runs on the host and uses http://127.0.0.1:54321.
Everything in the OPTIONAL sections can stay empty: only the integrations and features you configure will work.
supabase/seed.sql is generated; don't edit it by hand. Its sources:
- the integrations registered in
INTEGRATION_ROUTERS(aci_server/main.py): input/output schemas,examples.yaml,component.json; aci_server/db/scripts/catalog.json: name, description, category, auth method, logo, custom auth fields, OAuth scopes and which scopes each action needs.
# regenerate supabase/seed.sql after changing an integration or catalog.json
docker-compose run --rm --no-deps -v "$PWD/supabase:/supabase" aci_server python db/scripts/seed_tools.py --sql /supabase/seed.sql
# validate only
docker-compose run --rm --no-deps aci_server python db/scripts/seed_tools.py --dry-run
# upsert the catalog into the database from .env (SUPABASE_URL / SUPABASE_SERVICE_KEY) without resetting it
docker-compose run --rm --no-deps aci_server python db/scripts/seed_tools.py # all integrations
docker-compose run --rm --no-deps aci_server python db/scripts/seed_tools.py slack exa # only someSeeding is idempotent and never deletes rows. Actions of an OAuth integration are enabled for a user only if they
are listed in that integration's action_scopes.
docker-compose up --buildThe API is available at http://localhost:8000 (OpenAPI docs at /docs), Celery Flower at http://localhost:5555.
cd main
npm install
npm run devThe web app is available at http://localhost:3000.
- Run all tests in Docker
docker-compose exec aci_server /app/run_tests.sh- Run tests for a specific integration
docker-compose exec aci_server /app/run_tests.sh dropboxSee CONTRIBUTING.md.
Contributions are welcome — see CONTRIBUTING.md. To report a vulnerability, follow SECURITY.md.












