├── backend
├── aci
│ ├── __init__.py
│ ├── cli
│ │ ├── __init__.py
│ │ ├── __main__.py
│ │ ├── commands
│ │ │ ├── subscription
│ │ │ │ ├── __init__.py
│ │ │ │ └── data
│ │ │ │ │ └── gate22_plans.json
│ │ │ ├── virtual_mcp
│ │ │ │ └── __init__.py
│ │ │ ├── adhoc
│ │ │ │ └── __init__.py
│ │ │ ├── mcp
│ │ │ │ └── __init__.py
│ │ │ └── mock_data
│ │ │ │ └── __init__.py
│ │ ├── config.py
│ │ └── README.md
│ ├── mcp
│ │ ├── __init__.py
│ │ ├── tests
│ │ │ └── __init__.py
│ │ ├── middleware
│ │ │ └── __init__.py
│ │ ├── protocol
│ │ │ └── __init__.py
│ │ ├── routes
│ │ │ ├── __init__.py
│ │ │ ├── handlers
│ │ │ │ ├── tools
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── __init__.py
│ │ │ │ └── tools_list.py
│ │ │ └── health.py
│ │ ├── context.py
│ │ ├── logging.py
│ │ └── dependencies.py
│ ├── common
│ │ ├── __init__.py
│ │ ├── schemas
│ │ │ ├── __init__.py
│ │ │ ├── user.py
│ │ │ ├── mcp_server_bundle.py
│ │ │ └── pagination.py
│ │ ├── db
│ │ │ ├── __init__.py
│ │ │ └── crud
│ │ │ │ ├── virtual_mcp
│ │ │ │ └── __init__.py
│ │ │ │ └── __init__.py
│ │ ├── sentry.py
│ │ ├── openai_client.py
│ │ ├── url_utils.py
│ │ └── test_utils.py
│ ├── control_plane
│ │ ├── __init__.py
│ │ ├── middleware
│ │ │ └── __init__.py
│ │ ├── routes
│ │ │ ├── __init__.py
│ │ │ ├── organization
│ │ │ │ └── __init__.py
│ │ │ ├── health.py
│ │ │ └── mcp_tools.py
│ │ ├── context.py
│ │ ├── services
│ │ │ ├── __init__.py
│ │ │ ├── mcp_tools
│ │ │ │ └── __init__.py
│ │ │ ├── oauth2_client
│ │ │ │ └── __init__.py
│ │ │ └── subscription
│ │ │ │ └── stripe_client.py
│ │ └── tests
│ │ │ └── dummy_mcp_servers
│ │ │ ├── gmail
│ │ │ ├── server.json
│ │ │ └── tools.json
│ │ │ ├── notion
│ │ │ └── server.json
│ │ │ └── github
│ │ │ ├── tools.json
│ │ │ └── server.json
│ ├── virtual_mcp
│ │ ├── __init__.py
│ │ ├── routes
│ │ │ ├── __init__.py
│ │ │ ├── handlers
│ │ │ │ └── __init__.py
│ │ │ └── health.py
│ │ ├── tests
│ │ │ └── __init__.py
│ │ ├── middleware
│ │ │ └── __init__.py
│ │ ├── executors
│ │ │ ├── connectors
│ │ │ │ ├── __init__.py
│ │ │ │ ├── vercel.py
│ │ │ │ └── e2b.py
│ │ │ └── __init__.py
│ │ ├── context.py
│ │ ├── dependencies.py
│ │ └── config.py
│ └── alembic
│ │ ├── README
│ │ ├── script.py.mako
│ │ └── versions
│ │ ├── 2025_08_25_1003-94b423b00cf5_pgvector_setup.py
│ │ ├── 2025_08_31_1957-7ace8fa6021e_add_transport_type_to_mcpserver.py
│ │ ├── 2025_09_01_2212-63224673a97a_add_name_and_description_to_.py
│ │ └── 2025_08_26_1309-6e960597029b_rename_field_mcp_server_configuration_.py
├── .python-version
├── .prettierrc
├── virtual_mcp_servers
│ ├── dify
│ │ └── server.json
│ ├── lmnt
│ │ └── server.json
│ ├── aidbase
│ │ └── server.json
│ ├── browserbase
│ │ └── server.json
│ ├── e2b
│ │ ├── server.json
│ │ └── tools.json
│ ├── google_tasks
│ │ └── server.json
│ ├── holded
│ │ └── server.json
│ ├── dexscreener
│ │ └── server.json
│ ├── supabase
│ │ └── server.json
│ ├── steel
│ │ └── server.json
│ ├── notte
│ │ └── server.json
│ ├── accredible
│ │ └── server.json
│ ├── aero_workflow
│ │ └── server.json
│ ├── cloudflare
│ │ └── server.json
│ ├── baserow
│ │ └── server.json
│ ├── clickup
│ │ └── server.json
│ ├── netlify
│ │ └── server.json
│ ├── gmail
│ │ └── server.json
│ ├── api_template
│ │ └── server.json
│ ├── daytona
│ │ └── server.json
│ ├── figma
│ │ └── server.json
│ ├── reddit
│ │ └── server.json
│ ├── vercel
│ │ └── server.json
│ ├── serpapi
│ │ └── server.json
│ ├── apaleo
│ │ └── server.json
│ ├── agent_mail
│ │ └── server.json
│ ├── all_images
│ │ └── server.json
│ ├── feishu
│ │ └── server.json
│ ├── factorialhr
│ │ └── server.json
│ ├── breezy
│ │ └── server.json
│ ├── youtube
│ │ └── server.json
│ ├── calendly
│ │ └── server.json
│ ├── coinmarketcap
│ │ └── server.json
│ ├── baidu_map
│ │ └── server.json
│ ├── rocketreach
│ │ └── server.json
│ ├── scrapybara
│ │ └── server.json
│ ├── x
│ │ └── server.json
│ ├── brave_search
│ │ └── server.json
│ ├── resend
│ │ └── server.json
│ ├── akkio
│ │ └── server.json
│ ├── google_analytics_admin
│ │ └── server.json
│ ├── google_calendar
│ │ └── server.json
│ ├── google_sheets
│ │ └── server.json
│ ├── share_point
│ │ └── server.json
│ ├── sendgrid
│ │ └── server.json
│ ├── typefully
│ │ └── server.json
│ ├── microsoft_onedrive
│ │ └── server.json
│ ├── microsoft_calendar
│ │ └── server.json
│ ├── microsoft_teams
│ │ └── server.json
│ ├── active_campaign
│ │ └── server.json
│ ├── coda
│ │ └── server.json
│ ├── google_docs
│ │ └── server.json
│ ├── hackernews
│ │ └── server.json
│ ├── microsoft_outlook
│ │ └── server.json
│ ├── airtable
│ │ └── server.json
│ ├── eleven_labs
│ │ └── server.json
│ ├── zenrows
│ │ └── server.json
│ ├── google_meet
│ │ └── server.json
│ ├── cognito_forms
│ │ └── server.json
│ ├── one_signal
│ │ └── server.json
│ ├── ultra_msg
│ │ └── server.json
│ ├── arxiv
│ │ └── server.json
│ ├── cal
│ │ └── server.json
│ ├── google_maps
│ │ └── server.json
│ ├── slack
│ │ └── server.json
│ ├── discord
│ │ ├── server.json
│ │ └── tools.json
│ └── open_weather_map
│ │ └── server.json
├── .dockerignore
├── Dockerfile.runner
├── compose.ci.yml
├── Dockerfile.migration
├── mcp_servers
│ ├── lmnt
│ │ └── server.json
│ ├── dexscreener
│ │ └── server.json
│ ├── coingecko
│ │ └── server.json
│ ├── dify
│ │ └── server.json
│ ├── browserbase
│ │ └── server.json
│ ├── discord
│ │ ├── tools.json
│ │ └── server.json
│ ├── context7
│ │ └── server.json
│ ├── aidbase
│ │ └── server.json
│ ├── render
│ │ └── server.json
│ ├── holded
│ │ └── server.json
│ ├── anchor_browser
│ │ └── server.json
│ ├── steel
│ │ └── server.json
│ ├── aero_workflow
│ │ └── server.json
│ ├── notte
│ │ └── server.json
│ ├── serpapi
│ │ └── server.json
│ ├── api_template
│ │ └── server.json
│ ├── supabase
│ │ └── server.json
│ ├── all_images
│ │ └── server.json
│ ├── breezy
│ │ └── server.json
│ ├── cloudflare
│ │ └── server.json
│ ├── hackernews
│ │ └── server.json
│ ├── posthog
│ │ └── server.json
│ ├── stripe
│ │ └── server.json
│ ├── accredible
│ │ └── server.json
│ ├── baidu_map
│ │ └── server.json
│ ├── factorialhr
│ │ └── server.json
│ ├── baserow
│ │ └── server.json
│ ├── daytona
│ │ └── server.json
│ ├── apaleo
│ │ └── server.json
│ ├── vercel
│ │ └── server.json
│ ├── scrapybara
│ │ └── server.json
│ ├── akkio
│ │ └── server.json
│ ├── coinmarketcap
│ │ └── server.json
│ ├── feishu
│ │ └── server.json
│ ├── netlify
│ │ └── server.json
│ ├── rocketreach
│ │ └── server.json
│ ├── brave_search
│ │ └── server.json
│ ├── etherscan
│ │ └── server.json
│ ├── resend
│ │ └── server.json
│ ├── agent_mail
│ │ └── server.json
│ ├── sendgrid
│ │ └── server.json
│ ├── arxiv
│ │ └── server.json
│ ├── linkup
│ │ ├── server.json
│ │ └── tools.json
│ ├── typefully
│ │ └── server.json
│ ├── eleven_labs
│ │ └── server.json
│ ├── zenrows
│ │ └── server.json
│ ├── active_campaign
│ │ └── server.json
│ ├── coda
│ │ └── server.json
│ ├── ultra_msg
│ │ └── server.json
│ ├── airtable
│ │ └── server.json
│ ├── linear
│ │ └── server.json
│ ├── one_signal
│ │ └── server.json
│ ├── cognito_forms
│ │ └── server.json
│ ├── cal
│ │ └── server.json
│ ├── google_maps
│ │ └── server.json
│ ├── gitlab
│ │ └── server.json
│ ├── fireflies
│ │ └── server.json
│ ├── sentry
│ │ └── server.json
│ ├── notion
│ │ └── server.json
│ ├── open_weather_map
│ │ └── server.json
│ ├── clickup
│ │ └── server.json
│ ├── google_tasks
│ │ └── server.json
│ ├── neon
│ │ └── server.json
│ ├── gmail
│ │ └── server.json
│ ├── calendly
│ │ └── server.json
│ ├── google_sheets
│ │ └── server.json
│ ├── reddit
│ │ └── server.json
│ ├── github
│ │ └── server.json
│ ├── google_docs
│ │ └── server.json
│ ├── atlassian
│ │ └── server.json
│ ├── google_analytics_admin
│ │ └── server.json
│ ├── microsoft_onedrive
│ │ └── server.json
│ ├── microsoft_outlook
│ │ └── server.json
│ ├── microsoft_calendar
│ │ └── server.json
│ ├── exa
│ │ └── server.json
│ ├── share_point
│ │ └── server.json
│ ├── google_calendar
│ │ └── server.json
│ ├── x
│ │ └── server.json
│ ├── google_meet
│ │ └── server.json
│ ├── youtube
│ │ └── server.json
│ └── figma
│ │ └── server.json
├── .importlinter
├── Dockerfile.mcp
├── Dockerfile.virtual_mcp
└── Dockerfile.control_plane
├── frontend
├── vitest.setup.ts
├── .prettierignore
├── public
│ ├── favicon-dark.ico
│ ├── favicon-16x16.png
│ ├── favicon-32x32.png
│ ├── favicon-light.ico
│ ├── gate22-banner.png
│ ├── apple-touch-icon.png
│ ├── android-chrome-192x192.png
│ ├── android-chrome-512x512.png
│ └── site.webmanifest
├── src
│ ├── components
│ │ ├── layout
│ │ │ ├── footer.tsx
│ │ │ └── token-refresh-overlay.tsx
│ │ ├── ui
│ │ │ ├── skeleton.tsx
│ │ │ ├── collapsible.tsx
│ │ │ ├── label.tsx
│ │ │ ├── sonner.tsx
│ │ │ ├── textarea.tsx
│ │ │ ├── separator.tsx
│ │ │ ├── input.tsx
│ │ │ ├── progress.tsx
│ │ │ ├── switch.tsx
│ │ │ ├── formatted-text.tsx
│ │ │ ├── avatar.tsx
│ │ │ └── checkbox.tsx
│ │ ├── theme-provider.tsx
│ │ ├── data-table
│ │ │ └── data-table-advanced-toolbar.tsx
│ │ ├── ui-extensions
│ │ │ └── enhanced-data-table
│ │ │ │ └── row-selection-column.tsx
│ │ └── theme-toggle.tsx
│ ├── config
│ │ └── api.constants.ts
│ ├── features
│ │ ├── mcp
│ │ │ └── hooks
│ │ │ │ └── use-mcp-server-configurations.ts
│ │ ├── teams
│ │ │ ├── components
│ │ │ │ └── team-member-invitation-dialog.tsx
│ │ │ ├── types
│ │ │ │ └── team.types.ts
│ │ │ └── hooks
│ │ │ │ └── use-teams.ts
│ │ ├── connected-accounts
│ │ │ └── types
│ │ │ │ ├── mcp-server-configuration.types.ts
│ │ │ │ └── connectedaccount.types.ts
│ │ ├── settings
│ │ │ ├── hooks
│ │ │ │ ├── use-plans.ts
│ │ │ │ ├── use-subscription-status.ts
│ │ │ │ └── use-cancel-subscription.ts
│ │ │ ├── types
│ │ │ │ └── organization.types.ts
│ │ │ └── components
│ │ │ │ ├── settings-section.tsx
│ │ │ │ ├── settings-item.tsx
│ │ │ │ └── teams-settings.tsx
│ │ ├── invitations
│ │ │ └── types
│ │ │ │ └── invitation.types.ts
│ │ └── logs
│ │ │ ├── api
│ │ │ └── logs.service.ts
│ │ │ └── types
│ │ │ └── logs.types.ts
│ ├── lib
│ │ ├── utils.ts
│ │ ├── feature-flags.ts
│ │ ├── format.ts
│ │ ├── safe-redirect.ts
│ │ └── id.ts
│ ├── app
│ │ ├── (dashboard)
│ │ │ ├── teams
│ │ │ │ ├── page.tsx
│ │ │ │ ├── new
│ │ │ │ │ └── page.tsx
│ │ │ │ └── [teamId]
│ │ │ │ │ └── page.tsx
│ │ │ ├── members
│ │ │ │ └── page.tsx
│ │ │ ├── organization-settings
│ │ │ │ └── page.tsx
│ │ │ └── subscription
│ │ │ │ └── page.tsx
│ │ ├── (landing)
│ │ │ └── page.tsx
│ │ └── global-error.tsx
│ ├── instrumentation.ts
│ ├── utils
│ │ └── time.ts
│ ├── hooks
│ │ ├── use-mobile.tsx
│ │ ├── use-debounced-callback.ts
│ │ └── use-callback-ref.ts
│ ├── providers
│ │ └── query-provider.tsx
│ └── types
│ │ └── data-table.ts
├── vercel.json
├── .env.example
├── postcss.config.mjs
├── .prettierrc
├── sentryoptions.ts
├── eslint.config.mjs
├── vitest.config.mts
├── components.json
├── tsconfig.json
├── .gitignore
├── sentry.server.config.ts
└── sentry.edge.config.ts
├── .gitignore
├── .vscode
└── settings.json
└── .github
├── PULL_REQUEST_TEMPLATE.md
└── workflows
├── frontend-checks.yml
└── ecs-build-image.yml
/backend/aci/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/aci/cli/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/aci/mcp/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/.python-version:
--------------------------------------------------------------------------------
1 | 3.12
2 |
--------------------------------------------------------------------------------
/backend/aci/common/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/aci/mcp/tests/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/aci/common/schemas/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/aci/control_plane/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/aci/mcp/middleware/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/aci/mcp/protocol/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/aci/mcp/routes/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/aci/virtual_mcp/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/aci/virtual_mcp/routes/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/aci/virtual_mcp/tests/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/aci/control_plane/middleware/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/aci/control_plane/routes/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/aci/virtual_mcp/middleware/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/aci/mcp/routes/handlers/tools/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/aci/virtual_mcp/executors/connectors/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/backend/aci/alembic/README:
--------------------------------------------------------------------------------
1 | Generic single-database configuration.
2 |
--------------------------------------------------------------------------------
/frontend/vitest.setup.ts:
--------------------------------------------------------------------------------
1 | import "@testing-library/jest-dom/vitest";
2 |
--------------------------------------------------------------------------------
/frontend/.prettierignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .next
3 | build
4 | dist
5 | ui/
6 |
--------------------------------------------------------------------------------
/backend/aci/common/db/__init__.py:
--------------------------------------------------------------------------------
1 | from . import crud
2 |
3 | __all__ = ["crud"]
4 |
--------------------------------------------------------------------------------
/backend/aci/control_plane/routes/organization/__init__.py:
--------------------------------------------------------------------------------
1 | """Organization-related routes package."""
2 |
--------------------------------------------------------------------------------
/backend/aci/cli/__main__.py:
--------------------------------------------------------------------------------
1 | from aci.cli.aci import cli
2 |
3 | if __name__ == "__main__":
4 | cli()
5 |
--------------------------------------------------------------------------------
/backend/aci/common/db/crud/virtual_mcp/__init__.py:
--------------------------------------------------------------------------------
1 | from . import servers, tools
2 |
3 | __all__ = ["servers", "tools"]
4 |
--------------------------------------------------------------------------------
/frontend/public/favicon-dark.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aipotheosis-labs/gate22/HEAD/frontend/public/favicon-dark.ico
--------------------------------------------------------------------------------
/frontend/public/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aipotheosis-labs/gate22/HEAD/frontend/public/favicon-16x16.png
--------------------------------------------------------------------------------
/frontend/public/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aipotheosis-labs/gate22/HEAD/frontend/public/favicon-32x32.png
--------------------------------------------------------------------------------
/frontend/public/favicon-light.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aipotheosis-labs/gate22/HEAD/frontend/public/favicon-light.ico
--------------------------------------------------------------------------------
/frontend/public/gate22-banner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aipotheosis-labs/gate22/HEAD/frontend/public/gate22-banner.png
--------------------------------------------------------------------------------
/frontend/public/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aipotheosis-labs/gate22/HEAD/frontend/public/apple-touch-icon.png
--------------------------------------------------------------------------------
/frontend/src/components/layout/footer.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | export const Footer = () => {
3 | return ;
4 | };
5 |
--------------------------------------------------------------------------------
/frontend/src/config/api.constants.ts:
--------------------------------------------------------------------------------
1 | // Base path for the control plane API
2 | export const CONTROL_PLANE_PATH = "/v1/control-plane";
3 |
--------------------------------------------------------------------------------
/backend/aci/mcp/context.py:
--------------------------------------------------------------------------------
1 | import contextvars
2 |
3 | request_id_ctx_var = contextvars.ContextVar[str]("request_id", default="unknown")
4 |
--------------------------------------------------------------------------------
/frontend/public/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aipotheosis-labs/gate22/HEAD/frontend/public/android-chrome-192x192.png
--------------------------------------------------------------------------------
/frontend/public/android-chrome-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aipotheosis-labs/gate22/HEAD/frontend/public/android-chrome-512x512.png
--------------------------------------------------------------------------------
/backend/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "semi": true,
3 | "singleQuote": false,
4 | "trailingComma": "all",
5 | "printWidth": 100,
6 | "tabWidth": 2
7 | }
8 |
--------------------------------------------------------------------------------
/backend/aci/control_plane/context.py:
--------------------------------------------------------------------------------
1 | import contextvars
2 |
3 | request_id_ctx_var = contextvars.ContextVar[str | None]("request_id", default="unknown")
4 |
--------------------------------------------------------------------------------
/backend/aci/virtual_mcp/context.py:
--------------------------------------------------------------------------------
1 | import contextvars
2 |
3 | request_id_ctx_var = contextvars.ContextVar[str | None]("request_id", default="unknown")
4 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/dify/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "DIFY",
3 | "description": "Dify API for managing AI-driven tasks and workflows."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/lmnt/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "LMNT",
3 | "description": "LMNT is an API for text-to-speech and voice cloning."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/aci/cli/commands/subscription/__init__.py:
--------------------------------------------------------------------------------
1 | from .insert_subscription_plan import insert_subscription_plan
2 |
3 | __all__ = ["insert_subscription_plan"]
4 |
--------------------------------------------------------------------------------
/backend/aci/mcp/logging.py:
--------------------------------------------------------------------------------
1 | from enum import StrEnum
2 |
3 |
4 | class LogEvent(StrEnum):
5 | SEARCH_TOOLS = "search_tools"
6 | EXECUTE_TOOL = "execute_tool"
7 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/aidbase/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "AIDBASE",
3 | "description": "Integration with Aidbase API to manage resources and workflows."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/browserbase/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "BROWSERBASE",
3 | "description": "Browserbase is a platform for running headless browsers."
4 | }
5 |
--------------------------------------------------------------------------------
/frontend/src/features/mcp/hooks/use-mcp-server-configurations.ts:
--------------------------------------------------------------------------------
1 | // Re-export the hook for easier imports
2 | export { useMCPServerConfigurations } from "./use-mcp-servers";
3 |
--------------------------------------------------------------------------------
/frontend/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://openapi.vercel.sh/vercel.json",
3 | "git": {
4 | "deploymentEnabled": {
5 | "main": false
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/e2b/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "E2B",
3 | "description": "E2B is an open-source runtime for executing AI-generated code in secure cloud sandboxes."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/google_tasks/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "GOOGLE_TASKS",
3 | "description": "The Google Tasks API allows managing tasks and task lists programmatically."
4 | }
5 |
--------------------------------------------------------------------------------
/frontend/.env.example:
--------------------------------------------------------------------------------
1 | NODE_ENV=development
2 | NEXT_PUBLIC_API_URL=http://localhost:8000
3 | NEXT_PUBLIC_MCP_BASE_URL=http://localhost:8001/gateway
4 | NEXT_PUBLIC_SUBSCRIPTION_ENABLED=false
5 |
--------------------------------------------------------------------------------
/backend/aci/control_plane/services/__init__.py:
--------------------------------------------------------------------------------
1 | """
2 | Service layer for control plane business logic.
3 | """
4 |
5 | from .email_service import EmailService
6 |
7 | __all__ = ["EmailService"]
8 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/holded/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "HOLDED",
3 | "description": "Holded API for managing team, employees, payroll, treasury, invoicing and other business operations."
4 | }
5 |
--------------------------------------------------------------------------------
/frontend/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('postcss-load-config').Config} */
2 | const config = {
3 | plugins: {
4 | "@tailwindcss/postcss": {},
5 | },
6 | };
7 |
8 | export default config;
9 |
--------------------------------------------------------------------------------
/backend/aci/cli/commands/virtual_mcp/__init__.py:
--------------------------------------------------------------------------------
1 | from .upsert_server import upsert as upsert_server
2 | from .upsert_tools import upsert as upsert_tools
3 |
4 | __all__ = ["upsert_server", "upsert_tools"]
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/dexscreener/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "DEXSCREENER",
3 | "description": "DexScreener API integration for accessing token and pair information from decentralized exchanges."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/supabase/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "SUPABASE",
3 | "description": "Supabase is an open-source Firebase alternative providing real-time databases, authentication, and more."
4 | }
5 |
--------------------------------------------------------------------------------
/frontend/src/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { clsx, type ClassValue } from "clsx";
2 | import { twMerge } from "tailwind-merge";
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs));
6 | }
7 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/steel/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "STEEL",
3 | "description": "API for browser automation, web scraping, screenshot capture, and PDF generation with session management capabilities."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/notte/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "NOTTE",
3 | "description": "Notte transforms the internet into a space where each website becomes a structured, navigable map for intelligent agents."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/accredible/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ACCREDIBLE",
3 | "description": "Accredible integration for managing digital certificates and badges. Create, search, and generate PDFs for credentials."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/aero_workflow/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "AERO_WORKFLOW",
3 | "description": "Aero is workflow & practice management built specifically with the modern cloud-based accounting firm in mind."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/cloudflare/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "CLOUDFLARE",
3 | "description": "The Cloudflare API allows programmatic control over your Cloudflare account, including DNS, DDoS protection, and more."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/.dockerignore:
--------------------------------------------------------------------------------
1 | # custom ignores
2 | **/.env
3 | **/.env.example
4 | **/__pycache__
5 | **/*.pyc
6 |
7 | # Python
8 | __pycache__
9 | app.egg-info
10 | *.pyc
11 | .mypy_cache
12 | .coverage
13 | htmlcov
14 | .venv
15 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/baserow/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "BASEROW",
3 | "description": "Baserow is an open source no-code database tool and Airtable alternative. Create your own database without technical experience."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/clickup/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "CLICKUP",
3 | "description": "The ClickUp API allows you to interact with ClickUp programmatically, including workspace management, tasks, lists, folders, and more."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/netlify/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "NETLIFY",
3 | "description": "Netlify is a cloud hosting platform for web applications and static sites with continuous deployment, forms, and serverless functions."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/gmail/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "GMAIL",
3 | "description": "The Gmail API is a RESTful API that enables sending, reading, and managing emails. This integration allows sending emails on behalf of the user."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/api_template/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "API_TEMPLATE",
3 | "description": "APITemplate.io is a template-based document generation service that allows you to create PDFs and other documents from HTML templates."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/daytona/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "DAYTONA",
3 | "description": "Daytona provides secure and elastic infrastructure for running AI-generated code in isolated environments with sub-90ms sandbox creation time."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/figma/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "FIGMA",
3 | "description": "Figma is a browser-based collaborative interface design tool. This integration allows access to and processing of Figma design files and resources."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/reddit/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "REDDIT",
3 | "description": "The Reddit API allows you to interact with Reddit programmatically, including post management, comments, user interactions, and subreddit operations."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/vercel/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "VERCEL",
3 | "description": "The Vercel API allows programmatic control over deployments, projects, and integrations, including GitHub repository linking and deployment management."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/serpapi/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "SERPAPI",
3 | "description": "SerpApi integration for web search, images, news, academic papers, and trends, providing access to Google Search, Images, News, Scholar, and Trends APIs."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/aci/virtual_mcp/routes/handlers/__init__.py:
--------------------------------------------------------------------------------
1 | from aci.virtual_mcp.routes.handlers.tools_call import handle_tools_call
2 | from aci.virtual_mcp.routes.handlers.tools_list import handle_tools_list
3 |
4 | __all__ = ["handle_tools_call", "handle_tools_list"]
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/apaleo/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "APALEO",
3 | "description": "The open platform for modern hospitality. Hotel and apartment businesses run more efficiently on Apaleo today and use innovative apps to be ready for tomorrow."
4 | }
5 |
--------------------------------------------------------------------------------
/frontend/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "semi": true,
3 | "singleQuote": false,
4 | "trailingComma": "all",
5 | "printWidth": 100,
6 | "tabWidth": 2,
7 | "plugins": ["prettier-plugin-tailwindcss"],
8 | "tailwindStylesheet": "./src/app/globals.css"
9 | }
10 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/agent_mail/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "AGENT_MAIL",
3 | "description": "Agent Mail is an email service that helps manage and automate email communications with features for inbox management, thread tracking, and message handling."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/all_images/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ALL_IMAGES",
3 | "description": "All-Images.ai API integration for image search and AI image generation. Provides capabilities for searching stock images and generating custom images using AI."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/feishu/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "FEISHU",
3 | "description": "Feishu (Lark) is a suite of workplace collaboration tools developed by ByteDance. It provides APIs for messaging, document collaboration, and workplace automation."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/factorialhr/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "FACTORIAL_HR",
3 | "description": "Factorial HR API provides comprehensive HR management capabilities including employee management, task tracking, webhooks, job catalog, and finance management."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/breezy/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "BREEZY",
3 | "description": "Breezy HR is an applicant tracking system that helps companies streamline their hiring process with features for job posting, candidate management, and interview scheduling."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/youtube/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "YOUTUBE",
3 | "description": "YouTube API provides access to Google's streaming video repository, allowing you to search for videos, retrieve standard feeds, and manage YouTube subscriptions and playlists."
4 | }
5 |
--------------------------------------------------------------------------------
/frontend/src/features/teams/components/team-member-invitation-dialog.tsx:
--------------------------------------------------------------------------------
1 | // This component is deprecated and replaced with AddTeamMemberDialog
2 | // The backend API doesn't support email-based invitations
3 | // Instead, it requires adding existing organization members to teams
4 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/calendly/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "CALENDLY",
3 | "description": "Calendly integration for scheduling and managing meetings. This app allows you to automate your scheduling process, embed Calendly on your website, and manage your availability."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/coinmarketcap/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "COINMARKETCAP",
3 | "description": "CoinMarketCap API provides cryptocurrency market data including listings, quotes, mapping and global metrics. API accessible is subject to the pricing tier of the user."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/baidu_map/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "BAIDU_MAP",
3 | "description": "Baidu Map API is a set of map-based application interfaces for developers, providing services such as location search, geocoding, route planning, and real-time traffic conditions."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/rocketreach/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ROCKETREACH",
3 | "description": "RocketReach API lets you search and retrieve contact info for 700M+ professionals and 60M+ companies. Access accurate email addresses, phone numbers, and professional details."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/scrapybara/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "SCRAPYBARA",
3 | "description": "Scrapybara is a web scraping API designed for developers. It provides a powerful, fast, and simple interface to scrape any webpage and extract structured content in real time."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/x/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "X",
3 | "description": "X API v2 integration for accessing posts, users, communities, trends, and social interactions. Provides programmatic access to X's global conversation with real-time data and advanced analytics."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/brave_search/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "BRAVE_SEARCH",
3 | "description": "Brave Search API is a REST API to query Brave Search and get back search results from the web. It supports web search, summarizer search, image search, video search, news search."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/resend/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "RESEND",
3 | "description": "Resend is the email API for developers. It provides a modern API for sending transactional emails, managing email templates, and tracking email delivery status with comprehensive analytics."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/akkio/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "AKKIO",
3 | "description": "Akkio is a no-code AI platform that enables businesses to build, deploy, and maintain AI solutions for predictive analytics, forecasting, and classification without requiring data science expertise."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/google_analytics_admin/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "GOOGLE_ANALYTICS_ADMIN",
3 | "description": "The Google Analytics Admin API allows for programmatic access to the Google Analytics configuration data and is only compatible with Google Analytics properties."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/google_calendar/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "GOOGLE_CALENDAR",
3 | "description": "The Google Calendar API is a RESTful API that can be accessed through explicit HTTP calls. The API exposes most of the features available in the Google Calendar Web interface."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/google_sheets/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "GOOGLE_SHEETS",
3 | "description": "The Google Sheets API is a RESTful API that allows programmatic access to spreadsheet data and formatting. It supports CRUD operations, formulas, charts, and collaboration features."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/share_point/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "SHARE_POINT",
3 | "description": "The Microsoft Graph SharePoint API enables access to SharePoint sites, lists, libraries, and files. This integration allows reading and managing SharePoint content on behalf of the user."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/sendgrid/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "SENDGRID",
3 | "description": "SendGrid is a cloud-based email service that delivers transactional and marketing emails. It provides a robust API for sending emails, managing email templates, and tracking email delivery status."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/Dockerfile.runner:
--------------------------------------------------------------------------------
1 | FROM python:3.12
2 | COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
3 |
4 | WORKDIR /workdir
5 |
6 | COPY ./pyproject.toml ./uv.lock /workdir/
7 |
8 | RUN uv sync --no-install-project
9 |
10 | ENV PATH="/workdir/.venv/bin:$PATH"
11 | ENV PYTHONPATH=/workdir
12 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/typefully/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "TYPEFULLY",
3 | "description": "Typefully is a Twitter/X writing platform that helps users create, schedule, and publish better tweets and threads. It provides powerful API capabilities for draft management and content scheduling."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/aci/cli/commands/adhoc/__init__.py:
--------------------------------------------------------------------------------
1 | from .convert_integrations_to_mcp import convert as convert_integrations_to_mcp
2 | from .convert_integrations_to_virtual_mcp import convert as convert_integrations_to_virtual_mcp
3 |
4 | __all__ = ["convert_integrations_to_mcp", "convert_integrations_to_virtual_mcp"]
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/microsoft_onedrive/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "MICROSOFT_ONEDRIVE",
3 | "description": "The Microsoft Graph OneDrive API enables access to files and folders stored in OneDrive. This integration allows reading, managing, and searching OneDrive content on behalf of the user."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/aci/cli/commands/mcp/__init__.py:
--------------------------------------------------------------------------------
1 | from aci.cli.commands.mcp.generate_tools import generate_tools
2 | from aci.cli.commands.mcp.upsert_server import upsert_mcp_server
3 | from aci.cli.commands.mcp.upsert_tools import upsert_mcp_tools
4 |
5 | __all__ = ["generate_tools", "upsert_mcp_server", "upsert_mcp_tools"]
6 |
--------------------------------------------------------------------------------
/backend/aci/mcp/routes/handlers/__init__.py:
--------------------------------------------------------------------------------
1 | from aci.mcp.routes.handlers.initialize import handle_initialize
2 | from aci.mcp.routes.handlers.tools_call import handle_tools_call
3 | from aci.mcp.routes.handlers.tools_list import handle_tools_list
4 |
5 | __all__ = ["handle_initialize", "handle_tools_call", "handle_tools_list"]
6 |
--------------------------------------------------------------------------------
/backend/aci/mcp/routes/health.py:
--------------------------------------------------------------------------------
1 | from fastapi import APIRouter
2 |
3 | from aci.common.logging_setup import get_logger
4 |
5 | logger = get_logger(__name__)
6 | router = APIRouter()
7 |
8 |
9 | # TODO: add more checks?
10 | @router.get("", include_in_schema=False)
11 | async def health() -> bool:
12 | return True
13 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/microsoft_calendar/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "MICROSOFT_CALENDAR",
3 | "description": "The Microsoft Graph Calendar API enables access to Microsoft Calendar data including events, calendars, and scheduling. This integration allows reading and managing calendar content on behalf of the user."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/microsoft_teams/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "MICROSOFT_TEAMS",
3 | "description": "The Microsoft Graph Teams API enables access to Microsoft Teams data including teams, channels, messages, and team settings. This integration allows managing Teams content and collaboration on behalf of the user."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/active_campaign/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ACTIVE_CAMPAIGN",
3 | "description": "ActiveCampaign is a customer experience automation (CXA) platform that combines email marketing, marketing automation, sales automation and CRM capabilities to help businesses build better relationships with customers."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/coda/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "CODA",
3 | "description": "Coda is a document editor that brings together documents, spreadsheets, and applications into a single flexible platform. It allows teams to collaborate in real-time, create interactive documents, and build custom workflows without coding."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/google_docs/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "GOOGLE_DOCS",
3 | "description": "The Google Docs API allows developers to create, read, and update Google Docs documents programmatically. It provides access to Google Docs through RESTful HTTP calls, including create, read and update the Google Docs document."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/hackernews/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "HACKERNEWS",
3 | "description": "Hacker News is a social news website focusing on computer science and entrepreneurship, run by Y Combinator. This API allows you to fetch top stories, new stories, ask stories, show stories, and job postings from Hacker News."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/microsoft_outlook/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "MICROSOFT_OUTLOOK",
3 | "description": "The Microsoft Graph Outlook API enables access to Microsoft Outlook data including emails, folders, contacts, and mail settings. This integration allows reading and managing Outlook content on behalf of the user."
4 | }
5 |
--------------------------------------------------------------------------------
/frontend/src/features/connected-accounts/types/mcp-server-configuration.types.ts:
--------------------------------------------------------------------------------
1 | export type MCPServerBasic = {
2 | id: string;
3 | name: string;
4 | description?: string;
5 | };
6 |
7 | export type MCPServerConfigurationBasic = {
8 | id: string;
9 | mcp_server_id: string;
10 | mcp_server: MCPServerBasic;
11 | };
12 |
--------------------------------------------------------------------------------
/backend/aci/control_plane/routes/health.py:
--------------------------------------------------------------------------------
1 | from fastapi import APIRouter
2 |
3 | from aci.common.logging_setup import get_logger
4 |
5 | logger = get_logger(__name__)
6 | router = APIRouter()
7 |
8 |
9 | # TODO: add more checks?
10 | @router.get("", include_in_schema=False)
11 | async def health() -> bool:
12 | return True
13 |
--------------------------------------------------------------------------------
/backend/aci/virtual_mcp/routes/health.py:
--------------------------------------------------------------------------------
1 | from fastapi import APIRouter
2 |
3 | from aci.common.logging_setup import get_logger
4 |
5 | logger = get_logger(__name__)
6 | router = APIRouter()
7 |
8 |
9 | # TODO: add more checks?
10 | @router.get("", include_in_schema=False)
11 | async def health() -> bool:
12 | return True
13 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/airtable/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "AIRTABLE",
3 | "description": "Airtable is a cloud-based platform that combines the functionality of a database with the visual interface of a spreadsheet. It allows users to organize and track information, collaborate with team members, and create custom applications."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/aci/control_plane/services/mcp_tools/__init__.py:
--------------------------------------------------------------------------------
1 | """
2 | MCP Tools Services
3 |
4 | This package provides services for interacting with MCP server tools.
5 | """
6 |
7 | from .mcp_tools_fetcher import MCPToolsFetcher
8 | from .mcp_tools_manager import MCPToolsManager
9 |
10 | __all__ = ["MCPToolsFetcher", "MCPToolsManager"]
11 |
--------------------------------------------------------------------------------
/frontend/sentryoptions.ts:
--------------------------------------------------------------------------------
1 | export const SentryOptions = {
2 | development: {
3 | tracesSampleRate: 1,
4 | replaysSessionSampleRate: 1,
5 | replaysOnErrorSampleRate: 1,
6 | },
7 | production: {
8 | tracesSampleRate: 0.1,
9 | replaysSessionSampleRate: 0.1,
10 | replaysOnErrorSampleRate: 1,
11 | },
12 | };
13 |
--------------------------------------------------------------------------------
/frontend/src/app/(dashboard)/teams/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { TeamsSettings } from "@/features/settings/components/teams-settings";
4 |
5 | export default function TeamsSettingsPage() {
6 | return (
7 |
8 |
9 |
10 | );
11 | }
12 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # OS-specific
2 | .DS_Store
3 | Thumbs.db
4 |
5 | # IDE
6 | .vscode/
7 | .idea/
8 | *.swp
9 | *.swo
10 | *~
11 |
12 | # Environment variables
13 | .env
14 | .env.local
15 | .env.*.local
16 |
17 | # Temporary files
18 | tmp/
19 | temp/
20 | *.tmp
21 |
22 | # Logs
23 | *.log
24 |
25 | # Secrets
26 | *.secrets.*
27 | .secrets.*
28 |
--------------------------------------------------------------------------------
/frontend/src/app/(dashboard)/members/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { MembersSettings } from "@/features/settings/components/members-settings";
4 |
5 | export default function MembersPage() {
6 | return (
7 |
8 |
9 |
10 | );
11 | }
12 |
--------------------------------------------------------------------------------
/frontend/src/app/(dashboard)/teams/new/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { NewTeamSettings } from "@/features/settings/components/new-team-settings";
4 |
5 | export default function NewTeamPage() {
6 | return (
7 |
8 |
9 |
10 | );
11 | }
12 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/eleven_labs/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ELEVEN_LABS",
3 | "description": "Eleven Labs is an advanced text-to-speech (TTS) platform that provides high-quality, natural Text To Speech services. It allows users to create custom voices, convert text into realistic speech, and supports multiple languages and sound styles."
4 | }
5 |
--------------------------------------------------------------------------------
/frontend/src/app/(landing)/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useEffect } from "react";
4 | import { useRouter } from "next/navigation";
5 |
6 | export default function LandingPage() {
7 | const router = useRouter();
8 |
9 | useEffect(() => {
10 | router.replace("/mcp-servers");
11 | }, [router]);
12 |
13 | return null;
14 | }
15 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/zenrows/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ZENROWS",
3 | "description": "ZenRows is a powerful web scraping API that simplifies data extraction from any website. It handles rotating proxies, headless browsers, CAPTCHAs, and advanced anti-bot systems, providing a seamless solution for developers and businesses to collect web data efficiently."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/google_meet/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "GOOGLE_MEET",
3 | "description": "The Google Meet API allows developers to access and manage Google Meet resources programmatically. It provides information about meetings, participants, and recordings through RESTful HTTP calls including listing conference records, participants, and meeting spaces."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/cognito_forms/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "COGNITO_FORMS",
3 | "description": "Cognito Forms is a powerful online form builder that allows users to create custom forms, collect data, and automatically process payments. The tool supports complex field types, conditional logic, calculated fields, file uploads, and multiple integration options."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/one_signal/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ONE_SIGNAL",
3 | "description": "OneSignal is a comprehensive customer engagement solution that provides push notifications, in-app messaging, email, and SMS services. This integration enables managing and sending cross-platform notifications, tracking user engagement, and accessing notification analytics."
4 | }
5 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/skeleton.tsx:
--------------------------------------------------------------------------------
1 | import { cn } from "@/lib/utils";
2 |
3 | function Skeleton({ className, ...props }: React.ComponentProps<"div">) {
4 | return (
5 |
10 | );
11 | }
12 |
13 | export { Skeleton };
14 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/ultra_msg/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ULTRA_MSG",
3 | "description": "Ultra Msg is a WhatsApp API service that allows users to send and receive WhatsApp messages, manage contacts and groups, and automate WhatsApp workflows. This integration allows you to programmatically send text, pictures, documents and other media types of messages through WhatsApp."
4 | }
5 |
--------------------------------------------------------------------------------
/frontend/src/app/(dashboard)/organization-settings/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { OrganizationSettings } from "@/features/settings/components/organization-settings";
4 |
5 | export default function OrganizationSettingsPage() {
6 | return (
7 |
8 |
9 |
10 | );
11 | }
12 |
--------------------------------------------------------------------------------
/frontend/src/components/theme-provider.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import * as React from "react";
4 | import { ThemeProvider as NextThemesProvider } from "next-themes";
5 |
6 | export function ThemeProvider({
7 | children,
8 | ...props
9 | }: React.ComponentProps) {
10 | return {children};
11 | }
12 |
--------------------------------------------------------------------------------
/frontend/src/instrumentation.ts:
--------------------------------------------------------------------------------
1 | import * as Sentry from "@sentry/nextjs";
2 |
3 | export async function register() {
4 | if (process.env.NEXT_RUNTIME === "nodejs") {
5 | await import("../sentry.server.config");
6 | }
7 |
8 | if (process.env.NEXT_RUNTIME === "edge") {
9 | await import("../sentry.edge.config");
10 | }
11 | }
12 |
13 | export const onRequestError = Sentry.captureRequestError;
14 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/arxiv/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ARXIV",
3 | "description": "arXiv is an open-access repository of electronic preprints and postprints approved for posting after moderation, but not peer review. It consists of scientific papers in the fields of mathematics, physics, astronomy, electrical engineering, computer science, quantitative biology, statistics, mathematical finance and economics."
4 | }
5 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/collapsible.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
4 |
5 | const Collapsible = CollapsiblePrimitive.Root;
6 |
7 | const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;
8 |
9 | const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;
10 |
11 | export { Collapsible, CollapsibleTrigger, CollapsibleContent };
12 |
--------------------------------------------------------------------------------
/frontend/src/lib/feature-flags.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Feature flag utilities for controlling application features
3 | */
4 |
5 | /**
6 | * Check if subscription features are enabled
7 | * @returns {boolean} True if subscription features should be shown
8 | */
9 | export function isSubscriptionEnabled(): boolean {
10 | const enabled = process.env.NEXT_PUBLIC_SUBSCRIPTION_ENABLED === "true";
11 | return enabled;
12 | }
13 |
--------------------------------------------------------------------------------
/backend/aci/control_plane/services/oauth2_client/__init__.py:
--------------------------------------------------------------------------------
1 | from .client_registrator import ClientRegistrator
2 | from .metadata_fetcher import MetadataFetcher
3 | from .schema import OAuthClientInformationFull, OAuthClientMetadata, OAuthMetadata
4 |
5 | __all__ = [
6 | "ClientRegistrator",
7 | "MetadataFetcher",
8 | "OAuthClientInformationFull",
9 | "OAuthClientMetadata",
10 | "OAuthMetadata",
11 | ]
12 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/cal/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "CAL",
3 | "description": "Cal.com is a fully customizable scheduling platform that enables individuals and teams to automate meeting bookings, manage availability, and integrate with popular calendar and productivity tools. With Cal.com, users can streamline appointment scheduling, avoid double bookings, and enhance collaboration through flexible, privacy-focused solutions."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/google_maps/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "GOOGLE_MAPS",
3 | "description": "Navigate your world faster and easier with Google Maps. Over 220 countries and territories mapped and hundreds of millions of businesses and places on the map. Get real-time GPS navigation, traffic, and transit info, and find what you need by getting the latest information on businesses, including grocery stores, pharmacies and other important places."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/slack/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "SLACK",
3 | "description": "Slack is a team communication and collaboration tool. This API allows you to interact with Slack in two ways: as a bot for automated tasks and workflows, or as a user to perform actions on behalf of a real Slack user. Whether you're building chatbots, automating workflows, or integrating Slack with other tools, this API provides the flexibility to suit your needs."
4 | }
5 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/discord/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "DISCORD",
3 | "description": "Discord is a voice, video, and text communication service. This API allows you to interact with Discord in two ways: as a bot for automated tasks and workflows, or as a user to perform actions on behalf of a real Discord user. Whether you're building chatbots, automating workflows, or integrating Discord with other tools, this API provides the flexibility to suit your needs."
4 | }
5 |
--------------------------------------------------------------------------------
/frontend/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import { dirname } from "path";
2 | import { fileURLToPath } from "url";
3 | import { FlatCompat } from "@eslint/eslintrc";
4 |
5 | const __filename = fileURLToPath(import.meta.url);
6 | const __dirname = dirname(__filename);
7 |
8 | const compat = new FlatCompat({
9 | baseDirectory: __dirname,
10 | });
11 |
12 | const eslintConfig = [...compat.extends("next/core-web-vitals", "next/typescript")];
13 |
14 | export default eslintConfig;
15 |
--------------------------------------------------------------------------------
/frontend/public/site.webmanifest:
--------------------------------------------------------------------------------
1 | {
2 | "name": "",
3 | "short_name": "",
4 | "icons": [
5 | {
6 | "src": "/android-chrome-192x192.png",
7 | "sizes": "192x192",
8 | "type": "image/png"
9 | },
10 | {
11 | "src": "/android-chrome-512x512.png",
12 | "sizes": "512x512",
13 | "type": "image/png"
14 | }
15 | ],
16 | "theme_color": "#ffffff",
17 | "background_color": "#ffffff",
18 | "display": "standalone"
19 | }
20 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/open_weather_map/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "OPEN_WEATHER_MAP",
3 | "description": "OpenWeatherMap provides comprehensive weather data including current conditions and 5-day/3-hour forecasts. The API delivers accurate weather information based on the proprietary OpenWeather Model. This integration uses the free API endpoints (Current Weather Data and 5-day/3-hour Forecast) which are available on the free plan with a limit of 1,000 calls per day."
4 | }
5 |
--------------------------------------------------------------------------------
/frontend/src/lib/format.ts:
--------------------------------------------------------------------------------
1 | export function formatDate(
2 | date: Date | string | number | undefined,
3 | opts: Intl.DateTimeFormatOptions = {},
4 | ) {
5 | if (!date) return "";
6 |
7 | try {
8 | return new Intl.DateTimeFormat("en-US", {
9 | month: opts.month ?? "long",
10 | day: opts.day ?? "numeric",
11 | year: opts.year ?? "numeric",
12 | ...opts,
13 | }).format(new Date(date));
14 | } catch {
15 | return "";
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/backend/aci/cli/commands/mock_data/__init__.py:
--------------------------------------------------------------------------------
1 | from aci.cli.commands.mock_data.create_dummy_tool_call_logs import create_dummy_tool_call_logs
2 | from aci.cli.commands.mock_data.create_mock_mcp_configuration import create_mock_mcp_configuration
3 | from aci.cli.commands.mock_data.create_mock_org_teams_users import create_mock_org_teams_users
4 |
5 | __all__ = [
6 | "create_dummy_tool_call_logs",
7 | "create_mock_mcp_configuration",
8 | "create_mock_org_teams_users",
9 | ]
10 |
--------------------------------------------------------------------------------
/frontend/vitest.config.mts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "vitest/config";
2 | import react from "@vitejs/plugin-react";
3 | import tsconfigPaths from "vite-tsconfig-paths";
4 | import path from "path";
5 |
6 | export default defineConfig({
7 | plugins: [tsconfigPaths(), react()],
8 | test: {
9 | setupFiles: ["./vitest.setup.ts"],
10 | environment: "jsdom",
11 | },
12 | resolve: {
13 | alias: {
14 | "@": path.resolve(__dirname, "./src"),
15 | },
16 | },
17 | });
18 |
--------------------------------------------------------------------------------
/frontend/src/app/(dashboard)/teams/[teamId]/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useParams } from "next/navigation";
4 | import { TeamDetailSettings } from "@/features/settings/components/team-detail-settings";
5 |
6 | export default function TeamDetailPage() {
7 | const params = useParams();
8 | const teamId = params.teamId as string;
9 |
10 | return (
11 |
12 |
13 |
14 | );
15 | }
16 |
--------------------------------------------------------------------------------
/backend/aci/virtual_mcp/dependencies.py:
--------------------------------------------------------------------------------
1 | from collections.abc import Generator
2 |
3 | from sqlalchemy.orm import Session
4 |
5 | from aci.common import utils
6 | from aci.common.logging_setup import get_logger
7 | from aci.virtual_mcp import config
8 |
9 | logger = get_logger(__name__)
10 |
11 |
12 | def yield_db_session() -> Generator[Session, None, None]:
13 | db_session = utils.create_db_session(config.DB_FULL_URL)
14 | try:
15 | yield db_session
16 | finally:
17 | db_session.close()
18 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/discord/tools.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name": "DISCORD__GET_CURRENT_USER",
4 | "description": "Get a user object for the current user.",
5 | "tool_metadata": {
6 | "type": "rest",
7 | "method": "GET",
8 | "endpoint": "https://discord.com/api/v10/users/@me"
9 | },
10 | "input_schema": {
11 | "type": "object",
12 | "properties": {},
13 | "required": [],
14 | "visible": [],
15 | "additionalProperties": false
16 | }
17 | }
18 | ]
19 |
--------------------------------------------------------------------------------
/frontend/src/features/settings/hooks/use-plans.ts:
--------------------------------------------------------------------------------
1 | import { useQuery } from "@tanstack/react-query";
2 | import { useMetaInfo } from "@/components/context/metainfo";
3 | import { subscriptionApi } from "../api/subscription";
4 |
5 | export function usePlans() {
6 | const { activeOrg, accessToken } = useMetaInfo();
7 |
8 | return useQuery({
9 | queryKey: ["plans", activeOrg?.orgId],
10 | queryFn: () => subscriptionApi.getPlans(accessToken),
11 | enabled: !!accessToken && !!activeOrg?.orgId,
12 | });
13 | }
14 |
--------------------------------------------------------------------------------
/frontend/src/features/teams/types/team.types.ts:
--------------------------------------------------------------------------------
1 | export interface TeamMember {
2 | user_id: string;
3 | name: string;
4 | email: string;
5 | role: string;
6 | created_at: string;
7 | }
8 |
9 | export interface Team {
10 | team_id: string;
11 | name: string;
12 | description?: string;
13 | member_count?: number;
14 | status?: "active" | "inactive";
15 | created_at: string;
16 | }
17 |
18 | export interface CreateTeamRequest {
19 | name: string;
20 | description?: string;
21 | member_user_ids?: string[];
22 | }
23 |
--------------------------------------------------------------------------------
/backend/virtual_mcp_servers/e2b/tools.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name": "E2B__RUN_CODE",
4 | "description": "Runs code in an E2B.dev sandbox",
5 | "tool_metadata": {
6 | "type": "connector"
7 | },
8 | "input_schema": {
9 | "type": "object",
10 | "properties": {
11 | "code": {
12 | "type": "string",
13 | "description": "The python code to run in the sandbox"
14 | }
15 | },
16 | "required": ["code"],
17 | "additionalProperties": false
18 | }
19 | }
20 | ]
21 |
--------------------------------------------------------------------------------
/backend/compose.ci.yml:
--------------------------------------------------------------------------------
1 | services:
2 | # Override the runner service in compose.yml to use the CI environment variables
3 | # to run tests
4 | control_plane:
5 | environment:
6 | - CONTROL_PLANE_OPENAI_API_KEY=${CONTROL_PLANE_OPENAI_API_KEY?}
7 | - CLI_OPENAI_API_KEY=${CLI_OPENAI_API_KEY?}
8 | test-runner:
9 | environment:
10 | - CONTROL_PLANE_OPENAI_API_KEY=${CONTROL_PLANE_OPENAI_API_KEY?}
11 | - CLI_OPENAI_API_KEY=${CLI_OPENAI_API_KEY?}
12 | command: >
13 | /bin/sh -c "alembic upgrade head && uv run pytest"
14 |
--------------------------------------------------------------------------------
/frontend/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema.json",
3 | "style": "new-york",
4 | "rsc": true,
5 | "tsx": true,
6 | "tailwind": {
7 | "config": "tailwind.config.ts",
8 | "css": "src/app/globals.css",
9 | "baseColor": "neutral",
10 | "cssVariables": true,
11 | "prefix": ""
12 | },
13 | "aliases": {
14 | "components": "@/components",
15 | "utils": "@/lib/utils",
16 | "ui": "@/components/ui",
17 | "lib": "@/lib",
18 | "hooks": "@/hooks"
19 | },
20 | "iconLibrary": "lucide"
21 | }
22 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "[python]": {
3 | "editor.formatOnSave": true,
4 | "editor.defaultFormatter": "charliermarsh.ruff"
5 | },
6 | "[json][javascript][typescript][typescriptreact]": {
7 | "editor.formatOnSave": true,
8 | "editor.defaultFormatter": "esbenp.prettier-vscode"
9 | },
10 | "prettier.ignorePath": "frontend/.prettierignore",
11 | "editor.formatOnSave": true,
12 | "editor.codeActionsOnSave": {
13 | "source.organizeImports.ruff": "always"
14 | },
15 | "ruff.lint.enable": true
16 | }
17 |
--------------------------------------------------------------------------------
/frontend/src/features/settings/types/organization.types.ts:
--------------------------------------------------------------------------------
1 | export enum OrganizationRole {
2 | Admin = "admin",
3 | Member = "member",
4 | }
5 |
6 | export interface OrganizationUser {
7 | user_id: string;
8 | email: string;
9 | role: string; // Will be "admin" or "member" from backend
10 | name: string; // Full name from backend
11 | created_at?: string;
12 | // Frontend display fields (parsed from name)
13 | first_name?: string;
14 | last_name?: string;
15 | }
16 |
17 | export interface OrganizationMemberUpdate {
18 | role: OrganizationRole;
19 | }
20 |
--------------------------------------------------------------------------------
/frontend/src/lib/safe-redirect.ts:
--------------------------------------------------------------------------------
1 | const FALLBACK_ORIGIN = "http://localhost";
2 |
3 | export function sanitizeRedirectPath(path: string | null | undefined): string | null {
4 | if (!path) {
5 | return null;
6 | }
7 |
8 | if (!path.startsWith("/") || path.startsWith("//")) {
9 | return null;
10 | }
11 |
12 | try {
13 | const url = new URL(path, FALLBACK_ORIGIN);
14 | return `${url.pathname}${url.search}${url.hash}`;
15 | } catch (error) {
16 | console.error("Failed to sanitize redirect path", error);
17 | return null;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/backend/aci/control_plane/services/subscription/stripe_client.py:
--------------------------------------------------------------------------------
1 | from stripe import StripeClient
2 |
3 | from aci.control_plane import config
4 |
5 | _stripe_client_instance = None
6 |
7 |
8 | def get_stripe_client() -> StripeClient:
9 | global _stripe_client_instance
10 | if _stripe_client_instance is None:
11 | if config.SUBSCRIPTION_STRIPE_SECRET_KEY is None:
12 | raise ValueError("SUBSCRIPTION_STRIPE_SECRET_KEY is not set")
13 | _stripe_client_instance = StripeClient(config.SUBSCRIPTION_STRIPE_SECRET_KEY)
14 | return _stripe_client_instance
15 |
--------------------------------------------------------------------------------
/backend/Dockerfile.migration:
--------------------------------------------------------------------------------
1 | FROM python:3.12
2 | COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
3 |
4 | WORKDIR /workdir
5 |
6 | COPY ./pyproject.toml ./uv.lock /workdir/
7 | RUN uv sync --no-dev --no-install-project
8 |
9 | ENV PATH="/workdir/.venv/bin:$PATH"
10 | ENV PYTHONPATH=/workdir
11 |
12 | # .env files will be skipped by default specified in .dockerignore
13 | COPY ./aci/alembic /workdir/aci/alembic
14 | COPY ./aci/common /workdir/aci/common
15 | COPY ./alembic.ini /workdir/alembic.ini
16 | COPY ./aci/__init__.py /workdir/aci/__init__.py
17 |
18 | CMD ["uv", "run", "alembic", "upgrade", "head"]
19 |
--------------------------------------------------------------------------------
/backend/aci/cli/config.py:
--------------------------------------------------------------------------------
1 | from aci.common.utils import check_and_get_env_variable, construct_db_url
2 |
3 | DB_SCHEME = check_and_get_env_variable("CLI_DB_SCHEME")
4 | DB_USER = check_and_get_env_variable("CLI_DB_USER")
5 | DB_PASSWORD = check_and_get_env_variable("CLI_DB_PASSWORD")
6 | DB_HOST = check_and_get_env_variable("CLI_DB_HOST")
7 | DB_PORT = check_and_get_env_variable("CLI_DB_PORT")
8 | DB_NAME = check_and_get_env_variable("CLI_DB_NAME")
9 | DB_FULL_URL = construct_db_url(DB_SCHEME, DB_USER, DB_PASSWORD, DB_HOST, DB_PORT, DB_NAME)
10 |
11 | OPENAI_API_KEY = check_and_get_env_variable("CLI_OPENAI_API_KEY")
12 |
--------------------------------------------------------------------------------
/backend/mcp_servers/lmnt/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "LMNT",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=LMNT",
4 | "transport_type": "streamable_http",
5 | "description": "LMNT is an API for text-to-speech and voice cloning.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/lmnt.jpg",
7 | "categories": ["Media"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "X-API-Key"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/backend/aci/cli/commands/subscription/data/gate22_plans.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "plan_code": "GATE22_FREE_PLAN",
4 | "display_name": "Free",
5 | "is_public": true,
6 | "stripe_price_id": null,
7 | "max_seats_for_subscription": 2,
8 | "max_custom_mcp_servers": 1,
9 | "log_retention_days": 3
10 | },
11 | {
12 | "plan_code": "GATE22_TEAM_PLAN",
13 | "display_name": "Team",
14 | "is_public": true,
15 | "stripe_price_id": "",
16 | "max_seats_for_subscription": null,
17 | "max_custom_mcp_servers": 5,
18 | "log_retention_days": 7
19 | }
20 | ]
21 |
--------------------------------------------------------------------------------
/backend/aci/common/sentry.py:
--------------------------------------------------------------------------------
1 | import sentry_sdk
2 |
3 | from aci.common.enums import Environment
4 |
5 |
6 | def setup_sentry(dsn: str, environment: Environment) -> None:
7 | sentry_sdk.init(
8 | dsn=dsn,
9 | environment=environment,
10 | # Add data like request headers and IP for users,
11 | # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info
12 | send_default_pii=True,
13 | traces_sample_rate=1.0, # TODO: adjust later
14 | _experiments={
15 | "continuous_profiling_auto_start": True,
16 | },
17 | )
18 |
--------------------------------------------------------------------------------
/backend/aci/control_plane/tests/dummy_mcp_servers/gmail/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "GMAIL",
3 | "url": "https://mcp.gmail.com/mcp",
4 | "transport_type": "streamable_http",
5 | "description": "Gmail API is a REST API to manage Gmail accounts.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/gmail.svg",
7 | "categories": ["Productivity", "Email"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "X-API-Key"
13 | }
14 | ],
15 | "server_metadata": {}
16 | }
17 |
--------------------------------------------------------------------------------
/backend/mcp_servers/dexscreener/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "DEXSCREENER",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=DEXSCREENER",
4 | "transport_type": "streamable_http",
5 | "description": "DexScreener API integration for accessing token and pair information from decentralized exchanges.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/dexscreener.svg",
7 | "categories": ["Finance", "Blockchain"],
8 | "auth_configs": [
9 | {
10 | "type": "no_auth"
11 | }
12 | ],
13 | "server_metadata": {
14 | "is_virtual_mcp_server": true
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/frontend/src/features/connected-accounts/types/connectedaccount.types.ts:
--------------------------------------------------------------------------------
1 | import { MCPServerConfigurationBasic } from "./mcp-server-configuration.types";
2 | import { ConnectedAccountOwnership } from "@/features/mcp/types/mcp.types";
3 |
4 | export type ConnectedAccount = {
5 | id: string;
6 | user_id: string;
7 | mcp_server_configuration_id: string;
8 | ownership: ConnectedAccountOwnership;
9 | created_at: string;
10 | updated_at: string;
11 | last_used_at?: string;
12 | mcp_server_configuration: MCPServerConfigurationBasic;
13 | user?: {
14 | id: string;
15 | name: string;
16 | email: string;
17 | };
18 | };
19 |
--------------------------------------------------------------------------------
/frontend/src/utils/time.ts:
--------------------------------------------------------------------------------
1 | import dayjs from "dayjs";
2 | import utc from "dayjs/plugin/utc";
3 | import timezone from "dayjs/plugin/timezone";
4 |
5 | dayjs.extend(utc);
6 | dayjs.extend(timezone);
7 |
8 | const USER_TIMEZONE = dayjs.tz.guess();
9 |
10 | export function formatToLocalTime(
11 | date: Date | string,
12 | format: string = "DD/MM/YYYY HH:mm:ss",
13 | ): string {
14 | return dayjs.utc(date).tz(USER_TIMEZONE).format(format);
15 | }
16 |
17 | export function formatToUTCTime(
18 | date: Date | string,
19 | format: string = "DD/MM/YYYY HH:mm:ss",
20 | ): string {
21 | return dayjs(date).utc().format(format);
22 | }
23 |
--------------------------------------------------------------------------------
/backend/aci/common/schemas/user.py:
--------------------------------------------------------------------------------
1 | from uuid import UUID
2 |
3 | from pydantic import BaseModel
4 |
5 | from aci.common.enums import OrganizationRole
6 |
7 |
8 | class UserOrganizationInfo(BaseModel):
9 | organization_id: UUID
10 | organization_name: str
11 | role: OrganizationRole
12 |
13 |
14 | # Only used in getting own user profile, which discloses organization information
15 | class UserSelfProfile(BaseModel):
16 | user_id: UUID
17 | name: str
18 | email: str
19 | organizations: list[UserOrganizationInfo]
20 |
21 |
22 | class UserPublic(BaseModel):
23 | id: UUID
24 | name: str
25 | email: str
26 |
--------------------------------------------------------------------------------
/backend/mcp_servers/coingecko/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "COINGECKO",
3 | "url": "https://mcp.api.coingecko.com/mcp",
4 | "transport_type": "streamable_http",
5 | "description": "CoinGecko is a comprehensive API for accessing cryptocurrency data and market information. It provides real-time market data, historical prices, and comprehensive market analysis tools.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/coingecko.svg",
7 | "categories": ["Finance", "Blockchain"],
8 | "auth_configs": [
9 | {
10 | "type": "no_auth"
11 | }
12 | ],
13 | "server_metadata": {}
14 | }
15 |
--------------------------------------------------------------------------------
/backend/mcp_servers/dify/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "DIFY",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=DIFY",
4 | "transport_type": "streamable_http",
5 | "description": "Dify API for managing AI-driven tasks and workflows.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/dify.svg",
7 | "categories": ["Automation"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {
17 | "is_virtual_mcp_server": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/backend/mcp_servers/browserbase/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "BROWSERBASE",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=BROWSERBASE",
4 | "transport_type": "streamable_http",
5 | "description": "Browserbase is a platform for running headless browsers.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/browserbase.png",
7 | "categories": ["Browser", "Search & Scraping"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "x-bb-api-key"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/backend/mcp_servers/discord/tools.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name": "DISCORD__GET_CURRENT_USER",
4 | "description": "Get a user object for the current user.",
5 | "tags": [],
6 | "tool_metadata": {
7 | "canonical_tool_name": "GET_CURRENT_USER",
8 | "canonical_tool_description_hash": "c60412789b5fda01cd52e3bbbce334ac56ded8deefa039fda6226208552abcc8",
9 | "canonical_tool_input_schema_hash": "d746974fa9afd5e951f76f9af38954b0ad7f436f2120dc974da65e5ee39f856f"
10 | },
11 | "input_schema": {
12 | "type": "object",
13 | "required": [],
14 | "properties": {},
15 | "additionalProperties": false
16 | }
17 | }
18 | ]
19 |
--------------------------------------------------------------------------------
/backend/mcp_servers/context7/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "CONTEXT7",
3 | "url": "https://mcp.context7.com/mcp",
4 | "transport_type": "streamable_http",
5 | "description": "Context7 MCP pulls up-to-date, version-specific documentation and code examples straight from the source",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/context7.svg",
7 | "categories": ["Developer Tools"],
8 | "auth_configs": [
9 | {
10 | "type": "no_auth"
11 | },
12 | {
13 | "type": "api_key",
14 | "location": "header",
15 | "name": "CONTEXT7_API_KEY"
16 | }
17 | ],
18 | "server_metadata": {}
19 | }
20 |
--------------------------------------------------------------------------------
/backend/aci/common/openai_client.py:
--------------------------------------------------------------------------------
1 | from openai import OpenAI
2 |
3 | _openai_client_instance = None
4 |
5 |
6 | def init_openai_client(api_key: str) -> None:
7 | """Initialize the OpenAI client when the app starts."""
8 | global _openai_client_instance
9 | if _openai_client_instance is None:
10 | _openai_client_instance = OpenAI(api_key=api_key)
11 |
12 |
13 | def get_openai_client() -> OpenAI:
14 | """Get the OpenAI client instance. Must call init_openai_client() first."""
15 | if _openai_client_instance is None:
16 | raise RuntimeError("OpenAI client not initialized. Call init_openai_client() first.")
17 | return _openai_client_instance
18 |
--------------------------------------------------------------------------------
/frontend/src/hooks/use-mobile.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 |
3 | const MOBILE_BREAKPOINT = 768;
4 |
5 | export function useIsMobile() {
6 | const [isMobile, setIsMobile] = React.useState(undefined);
7 |
8 | React.useEffect(() => {
9 | const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
10 | const onChange = () => {
11 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
12 | };
13 | mql.addEventListener("change", onChange);
14 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
15 | return () => mql.removeEventListener("change", onChange);
16 | }, []);
17 |
18 | return !!isMobile;
19 | }
20 |
--------------------------------------------------------------------------------
/backend/mcp_servers/aidbase/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "AIDBASE",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=AIDBASE",
4 | "transport_type": "streamable_http",
5 | "description": "Integration with Aidbase API to manage resources and workflows.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/aidbase.svg",
7 | "categories": ["Integration", "Automation"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {
17 | "is_virtual_mcp_server": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/backend/mcp_servers/render/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "RENDER",
3 | "url": "https://mcp.render.com/mcp",
4 | "transport_type": "streamable_http",
5 | "description": "Render's Model Context Protocol (MCP) server enables you to manage your Render infrastructure directly from compatible AI apps.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/render.svg",
7 | "categories": ["Developer Tools", "Infrastructure"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {}
17 | }
18 |
--------------------------------------------------------------------------------
/backend/mcp_servers/holded/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "HOLDED",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=HOLDED",
4 | "transport_type": "streamable_http",
5 | "description": "Holded API for managing team, employees, payroll, treasury, invoicing and other business operations.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/holded.svg",
7 | "categories": ["Finance", "HR & Workforce"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/backend/mcp_servers/anchor_browser/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ANCHOR_BROWSER",
3 | "url": "https://api.anchorbrowser.io/mcp",
4 | "transport_type": "streamable_http",
5 | "description": "Anchor is the platform for AI Agentic browser automation, which solves the challenge of automating workflows for web applications that lack APIs or have limited API coverage.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/anchor_browser.svg",
7 | "categories": ["Browser"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "anchor-api-key"
13 | }
14 | ],
15 | "server_metadata": {}
16 | }
17 |
--------------------------------------------------------------------------------
/backend/mcp_servers/steel/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "STEEL",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=STEEL",
4 | "transport_type": "streamable_http",
5 | "description": "API for browser automation, web scraping, screenshot capture, and PDF generation with session management capabilities.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/steel.png",
7 | "categories": ["Search & Scraping", "Browser"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "steel-api-key"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/backend/.importlinter:
--------------------------------------------------------------------------------
1 | [importlinter]
2 | root_package = aci
3 | include_external_packages = true
4 |
5 | # 1) common must not depend on any feature modules
6 | [importlinter:contract:common_independent]
7 | name = Common must be independent
8 | type = forbidden
9 | source_modules =
10 | aci.common
11 | forbidden_modules =
12 | aci.cli
13 | aci.control_plane
14 | aci.mcp
15 | aci.virtual_mcp
16 |
17 | # 2) all non-common modules must not depend on each other
18 | [importlinter:contract:features_are_independent]
19 | name = Feature modules are independent of each other
20 | type = independence
21 | modules =
22 | aci.cli
23 | aci.control_plane
24 | aci.mcp
25 | aci.virtual_mcp
26 |
--------------------------------------------------------------------------------
/backend/mcp_servers/aero_workflow/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "AERO_WORKFLOW",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=AERO_WORKFLOW",
4 | "transport_type": "streamable_http",
5 | "description": "Aero is workflow & practice management built specifically with the modern cloud-based accounting firm in mind.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/aeroworkflow.svg",
7 | "categories": ["Productivity", "Automation"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "apikey"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/frontend/src/features/settings/components/settings-section.tsx:
--------------------------------------------------------------------------------
1 | import { ReactNode } from "react";
2 | import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
3 |
4 | interface SettingsSectionProps {
5 | title: string;
6 | description: string;
7 | children: ReactNode;
8 | }
9 |
10 | export function SettingsSection({ title, description, children }: SettingsSectionProps) {
11 | return (
12 |
13 |
14 | {title}
15 | {description}
16 |
17 | {children}
18 |
19 | );
20 | }
21 |
--------------------------------------------------------------------------------
/backend/mcp_servers/notte/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "NOTTE",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=NOTTE",
4 | "transport_type": "streamable_http",
5 | "description": "Notte transforms the internet into a space where each website becomes a structured, navigable map for intelligent agents.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/notte.png",
7 | "categories": ["Search & Scraping"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {
17 | "is_virtual_mcp_server": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/backend/mcp_servers/serpapi/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "SERPAPI",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=SERPAPI",
4 | "transport_type": "streamable_http",
5 | "description": "SerpApi integration for web search, images, news, academic papers, and trends, providing access to Google Search, Images, News, Scholar, and Trends APIs.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/serpapi.svg",
7 | "categories": ["Search & Scraping"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "query",
12 | "name": "api_key"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/frontend/src/features/teams/hooks/use-teams.ts:
--------------------------------------------------------------------------------
1 | import { useQuery } from "@tanstack/react-query";
2 | import { useMetaInfo } from "@/components/context/metainfo";
3 | import { listTeams } from "../api/team";
4 | import { Team } from "../types/team.types";
5 |
6 | export function useTeams() {
7 | const { activeOrg, accessToken } = useMetaInfo();
8 |
9 | return useQuery({
10 | queryKey: ["teams", activeOrg?.orgId],
11 | queryFn: () => {
12 | if (!accessToken || !activeOrg?.orgId) {
13 | throw new Error("Missing access token or organization ID");
14 | }
15 | return listTeams(accessToken, activeOrg.orgId);
16 | },
17 | enabled: !!accessToken && !!activeOrg?.orgId,
18 | });
19 | }
20 |
--------------------------------------------------------------------------------
/backend/mcp_servers/api_template/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "API_TEMPLATE",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=API_TEMPLATE",
4 | "transport_type": "streamable_http",
5 | "description": "APITemplate.io is a template-based document generation service that allows you to create PDFs and other documents from HTML templates.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/apitemplate.svg",
7 | "categories": ["Document Management"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "X-API-KEY"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/backend/mcp_servers/supabase/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "SUPABASE",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=SUPABASE",
4 | "transport_type": "streamable_http",
5 | "description": "Supabase is an open-source Firebase alternative providing real-time databases, authentication, and more.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/supabase.svg",
7 | "categories": ["Data & Analytics", "Dev Tools"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {
17 | "is_virtual_mcp_server": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/backend/mcp_servers/all_images/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ALL_IMAGES",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=ALL_IMAGES",
4 | "transport_type": "streamable_http",
5 | "description": "All-Images.ai API integration for image search and AI image generation. Provides capabilities for searching stock images and generating custom images using AI.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/all_images.svg",
7 | "categories": ["Media"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "api-key"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/backend/mcp_servers/breezy/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "BREEZY",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=BREEZY",
4 | "transport_type": "streamable_http",
5 | "description": "Breezy HR is an applicant tracking system that helps companies streamline their hiring process with features for job posting, candidate management, and interview scheduling.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/breezy.svg",
7 | "categories": ["HR"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/backend/mcp_servers/cloudflare/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "CLOUDFLARE",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=CLOUDFLARE",
4 | "transport_type": "streamable_http",
5 | "description": "The Cloudflare API allows programmatic control over your Cloudflare account, including DNS, DDoS protection, and more.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/cloudflare.png",
7 | "categories": ["Deployment"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {
17 | "is_virtual_mcp_server": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/backend/mcp_servers/hackernews/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "HACKERNEWS",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=HACKERNEWS",
4 | "transport_type": "streamable_http",
5 | "description": "Hacker News is a social news website focusing on computer science and entrepreneurship, run by Y Combinator. This API allows you to fetch top stories, new stories, ask stories, show stories, and job postings from Hacker News.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/hackernews.png",
7 | "categories": ["News"],
8 | "auth_configs": [
9 | {
10 | "type": "no_auth"
11 | }
12 | ],
13 | "server_metadata": {
14 | "is_virtual_mcp_server": true
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/backend/mcp_servers/posthog/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "POSTHOG",
3 | "url": "https://mcp.posthog.com/sse",
4 | "transport_type": "sse",
5 | "description": "PostHog is an open-source product analytics platform. It helps teams understand how users interact with their applications and make data-driven decisions without needing to send data to third-party analytics vendors.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/posthog.svg",
7 | "categories": ["Analytics"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {}
17 | }
18 |
--------------------------------------------------------------------------------
/backend/mcp_servers/stripe/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "STRIPE",
3 | "url": "https://mcp.stripe.com",
4 | "transport_type": "streamable_http",
5 | "description": "The Stripe Model Context Protocol (MCP) server defines a set of tools that AI agents can use to interact with the Stripe API and search our knowledge base (including documentation and support articles).",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/stripe.svg",
7 | "categories": ["Dev Tools", "Payments"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {}
17 | }
18 |
--------------------------------------------------------------------------------
/backend/mcp_servers/accredible/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ACCREDIBLE",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=ACCREDIBLE",
4 | "transport_type": "streamable_http",
5 | "description": "Accredible integration for managing digital certificates and badges. Create, search, and generate PDFs for credentials.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/accredible.svg",
7 | "categories": ["Document Management"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Token"
14 | }
15 | ],
16 | "server_metadata": {
17 | "is_virtual_mcp_server": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/backend/mcp_servers/baidu_map/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "BAIDU_MAP",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=BAIDU_MAP",
4 | "transport_type": "streamable_http",
5 | "description": "Baidu Map API is a set of map-based application interfaces for developers, providing services such as location search, geocoding, route planning, and real-time traffic conditions.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/baidu_map.svg",
7 | "categories": ["Location"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "query",
12 | "name": "ak"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/label.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import * as React from "react";
4 | import * as LabelPrimitive from "@radix-ui/react-label";
5 |
6 | import { cn } from "@/lib/utils";
7 |
8 | function Label({
9 | className,
10 | ...props
11 | }: React.ComponentProps) {
12 | return (
13 |
21 | );
22 | }
23 |
24 | export { Label };
25 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/sonner.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useTheme } from "next-themes";
4 | import { Toaster as Sonner, ToasterProps } from "sonner";
5 |
6 | const Toaster = ({ ...props }: ToasterProps) => {
7 | const { theme = "system" } = useTheme();
8 |
9 | return (
10 |
23 | );
24 | };
25 |
26 | export { Toaster };
27 |
--------------------------------------------------------------------------------
/backend/mcp_servers/factorialhr/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "FACTORIAL_HR",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=FACTORIAL_HR",
4 | "transport_type": "streamable_http",
5 | "description": "Factorial HR API provides comprehensive HR management capabilities including employee management, task tracking, webhooks, job catalog, and finance management.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/factorialhr.svg",
7 | "categories": ["HR & Workforce"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "x-api-key"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/backend/mcp_servers/baserow/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "BASEROW",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=BASEROW",
4 | "transport_type": "streamable_http",
5 | "description": "Baserow is an open source no-code database tool and Airtable alternative. Create your own database without technical experience.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/baserow.svg",
7 | "categories": ["Data & Analytics", "Productivity"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Token"
14 | }
15 | ],
16 | "server_metadata": {
17 | "is_virtual_mcp_server": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/backend/mcp_servers/daytona/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "DAYTONA",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=DAYTONA",
4 | "transport_type": "streamable_http",
5 | "description": "Daytona provides secure and elastic infrastructure for running AI-generated code in isolated environments with sub-90ms sandbox creation time.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/daytona.svg",
7 | "categories": ["Sandboxes", "Code"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {
17 | "is_virtual_mcp_server": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/frontend/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2017",
4 | "lib": ["dom", "dom.iterable", "esnext"],
5 | "allowJs": true,
6 | "skipLibCheck": true,
7 | "strict": true,
8 | "noEmit": true,
9 | "esModuleInterop": true,
10 | "module": "esnext",
11 | "moduleResolution": "bundler",
12 | "resolveJsonModule": true,
13 | "isolatedModules": true,
14 | "jsx": "preserve",
15 | "incremental": true,
16 | "baseUrl": ".",
17 | "paths": {
18 | "@/*": ["./src/*"]
19 | },
20 | "plugins": [
21 | {
22 | "name": "next"
23 | }
24 | ]
25 | },
26 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
27 | "exclude": ["node_modules"]
28 | }
29 |
--------------------------------------------------------------------------------
/backend/mcp_servers/apaleo/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "APALEO",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=APALEO",
4 | "transport_type": "streamable_http",
5 | "description": "The open platform for modern hospitality. Hotel and apartment businesses run more efficiently on Apaleo today and use innovative apps to be ready for tomorrow.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/apaleo.svg",
7 | "categories": ["Hospitality"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {
17 | "is_virtual_mcp_server": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/backend/mcp_servers/vercel/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "VERCEL",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=VERCEL",
4 | "transport_type": "streamable_http",
5 | "description": "The Vercel API allows programmatic control over deployments, projects, and integrations, including GitHub repository linking and deployment management.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/vercel.png",
7 | "categories": ["Deployment", "CI/CD"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {
17 | "is_virtual_mcp_server": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/backend/mcp_servers/scrapybara/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "SCRAPYBARA",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=SCRAPYBARA",
4 | "transport_type": "streamable_http",
5 | "description": "Scrapybara is a web scraping API designed for developers. It provides a powerful, fast, and simple interface to scrape any webpage and extract structured content in real time.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/scrapybara.webp",
7 | "categories": ["Search & Scraping"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "x-api-key"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/backend/aci/alembic/script.py.mako:
--------------------------------------------------------------------------------
1 | """${message}
2 |
3 | Revision ID: ${up_revision}
4 | Revises: ${down_revision | comma,n}
5 | Create Date: ${create_date}
6 |
7 | """
8 | from typing import Sequence, Union
9 |
10 | from alembic import op
11 | import sqlalchemy as sa
12 | ${imports if imports else ""}
13 |
14 | # revision identifiers, used by Alembic.
15 | revision: str = ${repr(up_revision)}
16 | down_revision: Union[str, None] = ${repr(down_revision)}
17 | branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)}
18 | depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)}
19 |
20 |
21 | def upgrade() -> None:
22 | ${upgrades if upgrades else "pass"}
23 |
24 |
25 | def downgrade() -> None:
26 | ${downgrades if downgrades else "pass"}
27 |
--------------------------------------------------------------------------------
/backend/mcp_servers/akkio/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "AKKIO",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=AKKIO",
4 | "transport_type": "streamable_http",
5 | "description": "Akkio is a no-code AI platform that enables businesses to build, deploy, and maintain AI solutions for predictive analytics, forecasting, and classification without requiring data science expertise.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/akkio.svg",
7 | "categories": ["Data & Analytics", "Automation"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "query",
12 | "name": "api_key"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/textarea.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 |
3 | import { cn } from "@/lib/utils";
4 |
5 | const Textarea = React.forwardRef<
6 | HTMLTextAreaElement,
7 | React.ComponentProps<"textarea">
8 | >(({ className, ...props }, ref) => {
9 | return (
10 |
18 | );
19 | });
20 | Textarea.displayName = "Textarea";
21 |
22 | export { Textarea };
23 |
--------------------------------------------------------------------------------
/backend/mcp_servers/coinmarketcap/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "COINMARKETCAP",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=COINMARKETCAP",
4 | "transport_type": "streamable_http",
5 | "description": "CoinMarketCap API provides cryptocurrency market data including listings, quotes, mapping and global metrics. API accessible is subject to the pricing tier of the user.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/coinmarketcap.svg",
7 | "categories": ["Finance", "Blockchain"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "X-CMC_PRO_API_KEY"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/backend/mcp_servers/feishu/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "FEISHU",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=FEISHU",
4 | "transport_type": "streamable_http",
5 | "description": "Feishu (Lark) is a suite of workplace collaboration tools developed by ByteDance. It provides APIs for messaging, document collaboration, and workplace automation.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/feishu.svg",
7 | "categories": ["Communication", "Productivity"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {
17 | "is_virtual_mcp_server": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/backend/mcp_servers/netlify/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "NETLIFY",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=NETLIFY",
4 | "transport_type": "streamable_http",
5 | "description": "Netlify is a cloud hosting platform for web applications and static sites with continuous deployment, forms, and serverless functions.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/netlify.svg",
7 | "categories": ["Dev Tools", "Cloud Infrastructure", "Web Development"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {
17 | "is_virtual_mcp_server": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/backend/mcp_servers/rocketreach/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ROCKETREACH",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=ROCKETREACH",
4 | "transport_type": "streamable_http",
5 | "description": "RocketReach API lets you search and retrieve contact info for 700M+ professionals and 60M+ companies. Access accurate email addresses, phone numbers, and professional details.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/rocketreach.png",
7 | "categories": ["Data & Analytics", "CRM & Sales"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Api-Key"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/backend/mcp_servers/brave_search/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "BRAVE_SEARCH",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=BRAVE_SEARCH",
4 | "transport_type": "streamable_http",
5 | "description": "Brave Search API is a REST API to query Brave Search and get back search results from the web. It supports web search, summarizer search, image search, video search, news search.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/brave_search.svg",
7 | "categories": ["Search & Scraping"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "X-Subscription-Token"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/backend/mcp_servers/etherscan/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ETHERSCAN",
3 | "url": "https://mcp.etherscan.io/mcp",
4 | "transport_type": "streamable_http",
5 | "description": "Etherscan is a blockchain explorer and analytics platform for Ethereum and other EVM-compatible blockchains. It provides real-time transaction data, token information, and network statistics to help users track and analyze blockchain activity.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/etherscan.svg",
7 | "categories": ["Blockchain"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {}
17 | }
18 |
--------------------------------------------------------------------------------
/frontend/src/app/global-error.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import * as Sentry from "@sentry/nextjs";
4 | import NextError from "next/error";
5 | import { useEffect } from "react";
6 |
7 | export default function GlobalError({ error }: { error: Error & { digest?: string } }) {
8 | useEffect(() => {
9 | Sentry.captureException(error);
10 | }, [error]);
11 |
12 | return (
13 |
14 |
15 | {/* `NextError` is the default Next.js error page component. Its type
16 | definition requires a `statusCode` prop. However, since the App Router
17 | does not expose status codes for errors, we simply pass 0 to render a
18 | generic error message. */}
19 |
20 |
21 |
22 | );
23 | }
24 |
--------------------------------------------------------------------------------
/backend/Dockerfile.mcp:
--------------------------------------------------------------------------------
1 | FROM python:3.12
2 | COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
3 |
4 | WORKDIR /workdir
5 |
6 | COPY ./pyproject.toml ./uv.lock /workdir/
7 | RUN uv sync --no-dev --no-install-project
8 |
9 | ENV PATH="/workdir/.venv/bin:$PATH"
10 | ENV PYTHONPATH=/workdir
11 |
12 | # .env files will be skipped by default specified in .dockerignore
13 | COPY ./aci/mcp /workdir/aci/mcp
14 | COPY ./aci/common /workdir/aci/common
15 | COPY ./aci/__init__.py /workdir/aci/__init__.py
16 |
17 | # remove unecessary or sensitive files (.env files are skipped by default specified in .dockerignore)
18 | RUN rm -rf /workdir/aci/mcp/tests
19 |
20 | CMD ["uvicorn", "aci.mcp.main:app", "--proxy-headers", "--forwarded-allow-ips=*", "--host", "0.0.0.0", "--port", "8000", "--no-access-log"]
21 |
--------------------------------------------------------------------------------
/backend/mcp_servers/resend/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "RESEND",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=RESEND",
4 | "transport_type": "streamable_http",
5 | "description": "Resend is the email API for developers. It provides a modern API for sending transactional emails, managing email templates, and tracking email delivery status with comprehensive analytics.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/resend.svg",
7 | "categories": ["Communication"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {
17 | "is_virtual_mcp_server": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/frontend/src/components/layout/token-refresh-overlay.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { Loader2 } from "lucide-react";
4 | import { useMetaInfo } from "@/components/context/metainfo";
5 |
6 | export const TokenRefreshOverlay = () => {
7 | const { isTokenRefreshing } = useMetaInfo();
8 |
9 | if (!isTokenRefreshing) return null;
10 |
11 | return (
12 |
13 |
14 |
15 |
16 |
Updating permissions...
17 |
18 |
19 |
20 | );
21 | };
22 |
--------------------------------------------------------------------------------
/frontend/src/hooks/use-debounced-callback.ts:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 |
3 | import { useCallbackRef } from "@/hooks/use-callback-ref";
4 |
5 | export function useDebouncedCallback unknown>(
6 | callback: T,
7 | delay: number,
8 | ) {
9 | const handleCallback = useCallbackRef(callback);
10 | const debounceTimerRef = React.useRef(0);
11 | React.useEffect(() => () => window.clearTimeout(debounceTimerRef.current), []);
12 |
13 | const setValue = React.useCallback(
14 | (...args: Parameters) => {
15 | window.clearTimeout(debounceTimerRef.current);
16 | debounceTimerRef.current = window.setTimeout(() => handleCallback(...args), delay);
17 | },
18 | [handleCallback, delay],
19 | );
20 |
21 | return setValue;
22 | }
23 |
--------------------------------------------------------------------------------
/frontend/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.*
7 | .yarn/*
8 | !.yarn/patches
9 | !.yarn/plugins
10 | !.yarn/releases
11 | !.yarn/versions
12 |
13 | # testing
14 | /coverage
15 |
16 | # next.js
17 | /.next/
18 | /out/
19 |
20 | # production
21 | /build
22 |
23 | # misc
24 | .DS_Store
25 | *.pem
26 |
27 | # debug
28 | npm-debug.log*
29 | yarn-debug.log*
30 | yarn-error.log*
31 | .pnpm-debug.log*
32 |
33 | # env files (can opt-in for committing if needed)
34 | .env
35 |
36 | # vercel
37 | .vercel
38 |
39 | # typescript
40 | *.tsbuildinfo
41 | next-env.d.ts
42 |
43 | tmp/
44 |
45 | .vscode
46 | .idea
47 | .claude
48 |
49 | # Sentry Config File
50 | .env.sentry-build-plugin
51 |
--------------------------------------------------------------------------------
/backend/aci/common/db/crud/__init__.py:
--------------------------------------------------------------------------------
1 | from . import (
2 | connected_accounts,
3 | mcp_server_bundles,
4 | mcp_server_configurations,
5 | mcp_servers,
6 | mcp_sessions,
7 | mcp_tool_call_logs,
8 | mcp_tools,
9 | organization_invitations,
10 | organizations,
11 | subscriptions,
12 | teams,
13 | user_verifications,
14 | users,
15 | virtual_mcp,
16 | )
17 |
18 | __all__ = [
19 | "connected_accounts",
20 | "mcp_server_bundles",
21 | "mcp_server_configurations",
22 | "mcp_servers",
23 | "mcp_sessions",
24 | "mcp_tool_call_logs",
25 | "mcp_tools",
26 | "organization_invitations",
27 | "organizations",
28 | "subscriptions",
29 | "teams",
30 | "user_verifications",
31 | "users",
32 | "virtual_mcp",
33 | ]
34 |
--------------------------------------------------------------------------------
/backend/mcp_servers/agent_mail/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "AGENT_MAIL",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=AGENT_MAIL",
4 | "transport_type": "streamable_http",
5 | "description": "Agent Mail is an email service that helps manage and automate email communications with features for inbox management, thread tracking, and message handling.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/agentmail.svg",
7 | "categories": ["Productivity", "Communication", "Email"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {
17 | "is_virtual_mcp_server": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/backend/mcp_servers/sendgrid/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "SENDGRID",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=SENDGRID",
4 | "transport_type": "streamable_http",
5 | "description": "SendGrid is a cloud-based email service that delivers transactional and marketing emails. It provides a robust API for sending emails, managing email templates, and tracking email delivery status.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/sendgrid.svg",
7 | "categories": ["Communication"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {
17 | "is_virtual_mcp_server": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/backend/aci/alembic/versions/2025_08_25_1003-94b423b00cf5_pgvector_setup.py:
--------------------------------------------------------------------------------
1 | """first version of complete schemas
2 |
3 | Revision ID: 94b423b00cf5
4 | Revises:
5 | Create Date: 2025-08-25 10:03:04.823304+00:00
6 |
7 | """
8 | from typing import Sequence, Union
9 |
10 | from alembic import op
11 |
12 |
13 | # revision identifiers, used by Alembic.
14 | revision: str = '94b423b00cf5'
15 | down_revision: Union[str, None] = None
16 | branch_labels: Union[str, Sequence[str], None] = None
17 | depends_on: Union[str, Sequence[str], None] = None
18 |
19 |
20 | def upgrade() -> None:
21 | # create extension if not exists vector;
22 | op.execute("CREATE EXTENSION IF NOT EXISTS vector;")
23 |
24 |
25 | def downgrade() -> None:
26 | # drop extentions
27 | op.execute("DROP EXTENSION IF EXISTS vector;")
28 |
--------------------------------------------------------------------------------
/backend/aci/virtual_mcp/executors/__init__.py:
--------------------------------------------------------------------------------
1 | from aci.common.db.sql_models import VirtualMCPTool
2 | from aci.common.enums import VirtualMCPToolType
3 | from aci.common.schemas.virtual_mcp import VirtualMCPToolMetadata
4 | from aci.virtual_mcp.executors.base_executor import ToolExecutor
5 | from aci.virtual_mcp.executors.connector_tool_executor import ConnectorToolExecutor
6 | from aci.virtual_mcp.executors.rest_tool_executor import RestFunctionExecutor
7 |
8 |
9 | def get_tool_executor(tool: VirtualMCPTool) -> ToolExecutor:
10 | tool_type = VirtualMCPToolMetadata.model_validate(tool.tool_metadata).root.type
11 | match tool_type:
12 | case VirtualMCPToolType.REST:
13 | return RestFunctionExecutor()
14 | case VirtualMCPToolType.CONNECTOR:
15 | return ConnectorToolExecutor()
16 |
--------------------------------------------------------------------------------
/backend/mcp_servers/arxiv/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ARXIV",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=ARXIV",
4 | "transport_type": "streamable_http",
5 | "description": "arXiv is an open-access repository of electronic preprints and postprints approved for posting after moderation, but not peer review. It consists of scientific papers in the fields of mathematics, physics, astronomy, electrical engineering, computer science, quantitative biology, statistics, mathematical finance and economics.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/arxiv.svg",
7 | "categories": ["Research"],
8 | "auth_configs": [
9 | {
10 | "type": "no_auth"
11 | }
12 | ],
13 | "server_metadata": {
14 | "is_virtual_mcp_server": true
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/backend/mcp_servers/linkup/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "LINKUP",
3 | "url": "https://mcp.linkup.so/sse",
4 | "transport_type": "sse",
5 | "description": "Linkup is a web search engine for AI apps. We connect your AI application to the internet. Our API provides grounding data to enrich your AI’s output and increase its precision, accuracy and factuality. Linkup is #1 in the world for factuality, scoring state-of-the-art results on OpenAI’s SimpleQA benchmark.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/linkup.svg",
7 | "categories": ["Search"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {}
17 | }
18 |
--------------------------------------------------------------------------------
/backend/mcp_servers/typefully/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "TYPEFULLY",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=TYPEFULLY",
4 | "transport_type": "streamable_http",
5 | "description": "Typefully is a Twitter/X writing platform that helps users create, schedule, and publish better tweets and threads. It provides powerful API capabilities for draft management and content scheduling.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/typefully.svg",
7 | "categories": ["Marketing", "Productivity"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "X-API-KEY",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {
17 | "is_virtual_mcp_server": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/backend/mcp_servers/eleven_labs/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ELEVEN_LABS",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=ELEVEN_LABS",
4 | "transport_type": "streamable_http",
5 | "description": "Eleven Labs is an advanced text-to-speech (TTS) platform that provides high-quality, natural Text To Speech services. It allows users to create custom voices, convert text into realistic speech, and supports multiple languages and sound styles.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/eleven_labs.svg",
7 | "categories": ["Media"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "xi-api-key"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/frontend/src/hooks/use-callback-ref.ts:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 |
3 | /**
4 | * @see https://github.com/radix-ui/primitives/blob/main/packages/react/use-callback-ref/src/useCallbackRef.tsx
5 | */
6 |
7 | /**
8 | * A custom hook that converts a callback to a ref to avoid triggering re-renders when passed as a
9 | * prop or avoid re-executing effects when passed as a dependency
10 | */
11 | function useCallbackRef unknown>(callback: T | undefined): T {
12 | const callbackRef = React.useRef(callback);
13 |
14 | React.useEffect(() => {
15 | callbackRef.current = callback;
16 | });
17 |
18 | // https://github.com/facebook/react/issues/19240
19 | return React.useMemo(() => ((...args) => callbackRef.current?.(...args)) as T, []);
20 | }
21 |
22 | export { useCallbackRef };
23 |
--------------------------------------------------------------------------------
/backend/Dockerfile.virtual_mcp:
--------------------------------------------------------------------------------
1 | FROM python:3.12
2 | COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
3 |
4 | WORKDIR /workdir
5 |
6 | COPY ./pyproject.toml ./uv.lock /workdir/
7 | RUN uv sync --no-dev --no-install-project
8 |
9 | ENV PATH="/workdir/.venv/bin:$PATH"
10 | ENV PYTHONPATH=/workdir
11 |
12 | # .env files will be skipped by default specified in .dockerignore
13 | COPY ./aci/virtual_mcp /workdir/aci/virtual_mcp
14 | COPY ./aci/common /workdir/aci/common
15 | COPY ./aci/__init__.py /workdir/aci/__init__.py
16 |
17 | # remove unecessary or sensitive files (.env files are skipped by default specified in .dockerignore)
18 | RUN rm -rf /workdir/aci/virtual_mcp/tests
19 |
20 | CMD ["uvicorn", "aci.virtual_mcp.main:app", "--proxy-headers", "--forwarded-allow-ips=*", "--host", "0.0.0.0", "--port", "8000", "--no-access-log"]
21 |
--------------------------------------------------------------------------------
/backend/aci/cli/README.md:
--------------------------------------------------------------------------------
1 | # ACI CLI
2 |
3 | ## Example Usage
4 |
5 | ### Upsert an MCP Server
6 |
7 | ```bash
8 | docker compose exec runner python -m aci.cli mcp upsert-server --server-file ./mcp_servers/notion/server.json
9 |
10 | docker compose exec runner python -m aci.cli mcp upsert-server --server-file ./mcp_servers/notion/server.json --skip-dry-run
11 | ```
12 |
13 | ### Upsert MCP Tools
14 |
15 | ```bash
16 | docker compose exec runner python -m aci.cli mcp upsert-tools --tools-file ./mcp_servers/notion/tools.json
17 |
18 | docker compose exec runner python -m aci.cli mcp upsert-tools --tools-file ./mcp_servers/notion/tools.json --skip-dry-run
19 | ```
20 |
21 | #### Create a mock organization, teams and users setting
22 |
23 | ```bash
24 | docker compose exec runner python -m aci.cli create-mock-org-teams-users
25 | ```
26 |
--------------------------------------------------------------------------------
/frontend/src/lib/id.ts:
--------------------------------------------------------------------------------
1 | import { customAlphabet } from "nanoid";
2 |
3 | const prefixes: Record = {};
4 |
5 | interface GenerateIdOptions {
6 | length?: number;
7 | separator?: string;
8 | }
9 |
10 | export function generateId(
11 | prefixOrOptions?: keyof typeof prefixes | GenerateIdOptions,
12 | inputOptions: GenerateIdOptions = {},
13 | ) {
14 | const finalOptions = typeof prefixOrOptions === "object" ? prefixOrOptions : inputOptions;
15 |
16 | const prefix = typeof prefixOrOptions === "object" ? undefined : prefixOrOptions;
17 |
18 | const { length = 12, separator = "_" } = finalOptions;
19 | const id = customAlphabet(
20 | "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
21 | length,
22 | )();
23 |
24 | return prefix ? `${prefixes[prefix]}${separator}${id}` : id;
25 | }
26 |
--------------------------------------------------------------------------------
/backend/Dockerfile.control_plane:
--------------------------------------------------------------------------------
1 | FROM python:3.12
2 | COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
3 |
4 | WORKDIR /workdir
5 |
6 | COPY ./pyproject.toml ./uv.lock /workdir/
7 | RUN uv sync --no-dev --no-install-project
8 |
9 | ENV PATH="/workdir/.venv/bin:$PATH"
10 | ENV PYTHONPATH=/workdir
11 |
12 | # .env files will be skipped by default specified in .dockerignore
13 | COPY ./aci/control_plane /workdir/aci/control_plane
14 | COPY ./aci/common /workdir/aci/common
15 | COPY ./aci/__init__.py /workdir/aci/__init__.py
16 |
17 | # remove unecessary or sensitive files (.env files are skipped by default specified in .dockerignore)
18 | RUN rm -rf /workdir/aci/control_plane/tests
19 |
20 | CMD ["uvicorn", "aci.control_plane.main:app", "--proxy-headers", "--forwarded-allow-ips=*", "--host", "0.0.0.0", "--port", "8000", "--no-access-log"]
21 |
--------------------------------------------------------------------------------
/backend/mcp_servers/zenrows/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ZENROWS",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=ZENROWS",
4 | "transport_type": "streamable_http",
5 | "description": "ZenRows is a powerful web scraping API that simplifies data extraction from any website. It handles rotating proxies, headless browsers, CAPTCHAs, and advanced anti-bot systems, providing a seamless solution for developers and businesses to collect web data efficiently.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/zenrows.svg",
7 | "categories": ["Search & Scraping"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "query",
12 | "name": "apikey"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/frontend/src/app/(dashboard)/subscription/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { PermissionGuard } from "@/components/rbac/permission-guard";
4 | import { SubscriptionSettings } from "@/features/settings/components/subscription-settings";
5 | import { PERMISSIONS } from "@/lib/rbac/permissions";
6 | import { isSubscriptionEnabled } from "@/lib/feature-flags";
7 | import { notFound } from "next/navigation";
8 |
9 | export default function SubscriptionPage() {
10 | // Return 404 if subscription features are disabled
11 | if (!isSubscriptionEnabled()) {
12 | notFound();
13 | }
14 |
15 | return (
16 |
17 |
18 |
19 |
20 |
21 | );
22 | }
23 |
--------------------------------------------------------------------------------
/backend/mcp_servers/active_campaign/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ACTIVE_CAMPAIGN",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=ACTIVE_CAMPAIGN",
4 | "transport_type": "streamable_http",
5 | "description": "ActiveCampaign is a customer experience automation (CXA) platform that combines email marketing, marketing automation, sales automation and CRM capabilities to help businesses build better relationships with customers.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/active_campaign.svg",
7 | "categories": ["Marketing", "CRM & Support", "Automation"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Api-Token"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/backend/mcp_servers/coda/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "CODA",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=CODA",
4 | "transport_type": "streamable_http",
5 | "description": "Coda is a document editor that brings together documents, spreadsheets, and applications into a single flexible platform. It allows teams to collaborate in real-time, create interactive documents, and build custom workflows without coding.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/coda.svg",
7 | "categories": ["Document Management", "Productivity"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {
17 | "is_virtual_mcp_server": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/separator.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import * as React from "react";
4 | import * as SeparatorPrimitive from "@radix-ui/react-separator";
5 |
6 | import { cn } from "@/lib/utils";
7 |
8 | function Separator({
9 | className,
10 | orientation = "horizontal",
11 | decorative = true,
12 | ...props
13 | }: React.ComponentProps) {
14 | return (
15 |
25 | );
26 | }
27 |
28 | export { Separator };
29 |
--------------------------------------------------------------------------------
/backend/mcp_servers/ultra_msg/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ULTRA_MSG",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=ULTRA_MSG",
4 | "transport_type": "streamable_http",
5 | "description": "Ultra Msg is a WhatsApp API service that allows users to send and receive WhatsApp messages, manage contacts and groups, and automate WhatsApp workflows. This integration allows you to programmatically send text, pictures, documents and other media types of messages through WhatsApp.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/ultra_msg.svg",
7 | "categories": ["Communication"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "body",
12 | "name": "token"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | ### 🏷️ Ticket
2 |
3 | [link the issue or ticket you are addressing in this PR here, or use the **Development**
4 | section on the right sidebar to link the issue]
5 |
6 | ### 📝 Description
7 |
8 | [Describe your changes in detail (optional if the issue you linked already contains a
9 | detail description of the change)]
10 |
11 | ### 🎥 Demo (if applicable)
12 |
13 | ### 📸 Screenshots (if applicable)
14 |
15 | ### ✅ Checklist
16 |
17 | - [ ] I have signed the [Contributor License Agreement]() (CLA) and read the [contributing guide](./../CONTRIBUTING.md) (required)
18 | - [ ] I have linked this PR to an issue or a ticket (required)
19 | - [ ] I have updated the documentation related to my change if needed
20 | - [ ] I have updated the tests accordingly (required for a bug fix or a new feature)
21 | - [ ] All checks on CI passed
22 |
--------------------------------------------------------------------------------
/backend/mcp_servers/airtable/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "AIRTABLE",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=AIRTABLE",
4 | "transport_type": "streamable_http",
5 | "description": "Airtable is a cloud-based platform that combines the functionality of a database with the visual interface of a spreadsheet. It allows users to organize and track information, collaborate with team members, and create custom applications.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/airtable.svg",
7 | "categories": ["Data & Analytics", "Productivity"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {
17 | "is_virtual_mcp_server": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/backend/mcp_servers/linear/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "LINEAR",
3 | "url": "https://mcp.linear.app/mcp",
4 | "transport_type": "streamable_http",
5 | "description": "Linear is a purpose-built tool for modern product development. Streamline issues, projects, and product roadmaps.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/linear.svg",
7 | "categories": ["Developer Tools", "Project Management"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "",
14 | "authorize_url": "https://mcp.linear.app/authorize",
15 | "access_token_url": "https://mcp.linear.app/token",
16 | "refresh_token_url": "https://mcp.linear.app/token"
17 | }
18 | ],
19 | "server_metadata": {}
20 | }
21 |
--------------------------------------------------------------------------------
/frontend/src/providers/query-provider.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
4 | import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
5 | import { useState } from "react";
6 |
7 | export function QueryProvider({ children }: { children: React.ReactNode }) {
8 | const [queryClient] = useState(
9 | () =>
10 | new QueryClient({
11 | defaultOptions: {
12 | queries: {
13 | staleTime: 60 * 1000, // 1 minute
14 | refetchOnWindowFocus: false,
15 | retry: 1,
16 | },
17 | },
18 | }),
19 | );
20 |
21 | return (
22 |
23 | {children}
24 | {process.env.NODE_ENV === "development" && }
25 |
26 | );
27 | }
28 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/input.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 |
3 | import { cn } from "@/lib/utils";
4 |
5 | const Input = React.forwardRef>(
6 | ({ className, type, ...props }, ref) => {
7 | return (
8 |
17 | );
18 | },
19 | );
20 | Input.displayName = "Input";
21 |
22 | export { Input };
23 |
--------------------------------------------------------------------------------
/frontend/src/features/invitations/types/invitation.types.ts:
--------------------------------------------------------------------------------
1 | export enum OrganizationInvitationStatus {
2 | Pending = "pending",
3 | Accepted = "accepted",
4 | Rejected = "rejected",
5 | Canceled = "canceled",
6 | }
7 |
8 | export interface OrganizationInvitationDetail {
9 | invitation_id: string;
10 | organization_id: string;
11 | email: string;
12 | inviter_user_id: string;
13 | inviter_name: string | null;
14 | role: string;
15 | status: OrganizationInvitationStatus;
16 | expires_at: string;
17 | used_at: string | null;
18 | created_at: string;
19 | updated_at: string;
20 | email_metadata?: Record | null;
21 | }
22 |
23 | export interface RespondInvitationPayload {
24 | token: string;
25 | }
26 |
27 | export interface PendingInvitationState {
28 | token: string;
29 | invitationId?: string | null;
30 | organizationId?: string | null;
31 | }
32 |
--------------------------------------------------------------------------------
/backend/mcp_servers/one_signal/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ONE_SIGNAL",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=ONE_SIGNAL",
4 | "transport_type": "streamable_http",
5 | "description": "OneSignal is a comprehensive customer engagement solution that provides push notifications, in-app messaging, email, and SMS services. This integration enables managing and sending cross-platform notifications, tracking user engagement, and accessing notification analytics.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/one_signal.svg",
7 | "categories": ["Communication", "Marketing"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Key"
14 | }
15 | ],
16 | "server_metadata": {
17 | "is_virtual_mcp_server": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/frontend/src/features/settings/hooks/use-subscription-status.ts:
--------------------------------------------------------------------------------
1 | import { useQuery } from "@tanstack/react-query";
2 | import { subscriptionApi } from "../api/subscription";
3 | import { SubscriptionStatus } from "../types/subscription.types";
4 | import { useMetaInfo } from "@/components/context/metainfo";
5 | import { QUERY_KEYS } from "../constants";
6 |
7 | export function useSubscriptionStatus() {
8 | const { activeOrg, accessToken } = useMetaInfo();
9 |
10 | return useQuery({
11 | queryKey: QUERY_KEYS.SUBSCRIPTION_STATUS(activeOrg?.orgId || ""),
12 | queryFn: () => {
13 | if (!accessToken || !activeOrg?.orgId) {
14 | throw new Error("Missing access token or organization ID");
15 | }
16 | return subscriptionApi.getSubscriptionStatus(activeOrg.orgId, accessToken);
17 | },
18 | enabled: !!accessToken && !!activeOrg?.orgId,
19 | });
20 | }
21 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/progress.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import * as React from "react";
4 | import * as ProgressPrimitive from "@radix-ui/react-progress";
5 |
6 | import { cn } from "@/lib/utils";
7 |
8 | function Progress({
9 | className,
10 | value,
11 | ...props
12 | }: React.ComponentProps) {
13 | return (
14 |
22 |
27 |
28 | );
29 | }
30 |
31 | export { Progress };
32 |
--------------------------------------------------------------------------------
/backend/aci/mcp/routes/handlers/tools_list.py:
--------------------------------------------------------------------------------
1 | from mcp import types as mcp_types
2 |
3 | from aci.common.logging_setup import get_logger
4 | from aci.mcp.routes.handlers.tools.execute_tool import EXECUTE_TOOL
5 | from aci.mcp.routes.handlers.tools.search_tools import SEARCH_TOOLS
6 | from aci.mcp.routes.jsonrpc import (
7 | JSONRPCSuccessResponse,
8 | JSONRPCToolsListRequest,
9 | )
10 |
11 | logger = get_logger(__name__)
12 |
13 |
14 | async def handle_tools_list(
15 | payload: JSONRPCToolsListRequest,
16 | ) -> JSONRPCSuccessResponse:
17 | """
18 | Handle the tools/list request for a MCP server.
19 | """
20 |
21 | return JSONRPCSuccessResponse(
22 | id=payload.id,
23 | result=mcp_types.ListToolsResult(
24 | tools=[
25 | SEARCH_TOOLS,
26 | EXECUTE_TOOL,
27 | ],
28 | ).model_dump(exclude_none=True),
29 | )
30 |
--------------------------------------------------------------------------------
/backend/mcp_servers/cognito_forms/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "COGNITO_FORMS",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=COGNITO_FORMS",
4 | "transport_type": "streamable_http",
5 | "description": "Cognito Forms is a powerful online form builder that allows users to create custom forms, collect data, and automatically process payments. The tool supports complex field types, conditional logic, calculated fields, file uploads, and multiple integration options.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/cognito_forms.svg",
7 | "categories": ["Productivity", "Data & Analytics"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization",
13 | "prefix": "Bearer"
14 | }
15 | ],
16 | "server_metadata": {
17 | "is_virtual_mcp_server": true
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/backend/mcp_servers/cal/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "CAL",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=CAL",
4 | "transport_type": "streamable_http",
5 | "description": "Cal.com is a fully customizable scheduling platform that enables individuals and teams to automate meeting bookings, manage availability, and integrate with popular calendar and productivity tools. With Cal.com, users can streamline appointment scheduling, avoid double bookings, and enhance collaboration through flexible, privacy-focused solutions.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/cal.svg",
7 | "categories": ["Productivity", "Communication"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "Authorization"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/backend/mcp_servers/google_maps/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "GOOGLE_MAPS",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=GOOGLE_MAPS",
4 | "transport_type": "streamable_http",
5 | "description": "Navigate your world faster and easier with Google Maps. Over 220 countries and territories mapped and hundreds of millions of businesses and places on the map. Get real-time GPS navigation, traffic, and transit info, and find what you need by getting the latest information on businesses, including grocery stores, pharmacies and other important places.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/google_maps.svg",
7 | "categories": ["Map"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "query",
12 | "name": "key"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/backend/mcp_servers/gitlab/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "GITLAB",
3 | "url": "https://gitlab.com/api/v4/mcp",
4 | "transport_type": "streamable_http",
5 | "description": "The MCP server provides a standardized way for AI tools to:\n\nAccess GitLab project information.\nRetrieve issue and merge request data.\nInteract with GitLab APIs securely.\nPerform GitLab-specific operations through AI assistants.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/gitlab.svg",
7 | "categories": ["Dev Tools"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "scope": "mcp",
13 | "authorize_url": "https://gitlab.com/oauth/authorize",
14 | "access_token_url": "https://gitlab.com/oauth/token",
15 | "refresh_token_url": "https://gitlab.com/oauth/token"
16 | }
17 | ],
18 | "server_metadata": {}
19 | }
20 |
--------------------------------------------------------------------------------
/backend/aci/control_plane/tests/dummy_mcp_servers/notion/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "NOTION",
3 | "url": "https://mcp.notion.com/mcp",
4 | "transport_type": "streamable_http",
5 | "description": "Notion API is a REST API to manage Notion workspaces which are collaborative environments where teams can organize work, manage projects, and store information in a highly customizable way.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/notion.svg",
7 | "categories": ["Productivity", "Document Management"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "dummy_notion_client_id",
12 | "scope": "",
13 | "authorize_url": "https://mcp.notion.com/authorize",
14 | "access_token_url": "https://mcp.notion.com/token",
15 | "refresh_token_url": "https://mcp.notion.com/token"
16 | }
17 | ],
18 | "server_metadata": {}
19 | }
20 |
--------------------------------------------------------------------------------
/backend/mcp_servers/fireflies/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "FIREFLIES",
3 | "url": "https://api.fireflies.ai/mcp",
4 | "transport_type": "streamable_http",
5 | "description": "The Fireflies MCP Server transforms what used to be 2–3 hours of manual transcript review into a 5-minute AI-powered analysis session by bringing Fireflies meeting data directly into the AI agents and tools you already use.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/fireflies.svg",
7 | "categories": ["Productivity", "Communication"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "scope": "",
13 | "authorize_url": "https://api.fireflies.ai/authorize",
14 | "access_token_url": "https://api.fireflies.ai/token",
15 | "refresh_token_url": "https://api.fireflies.ai/token"
16 | }
17 | ],
18 | "server_metadata": {}
19 | }
20 |
--------------------------------------------------------------------------------
/backend/mcp_servers/sentry/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "SENTRY",
3 | "url": "https://mcp.sentry.dev/mcp",
4 | "transport_type": "streamable_http",
5 | "description": "Sentry provides end-to-end distributed tracing, enabling developers to identify and debug performance issues and errors across their systems and services.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/sentry.svg",
7 | "categories": ["Developer Tools", "Monitoring", "Error Tracking"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "",
14 | "authorize_url": "https://mcp.sentry.dev/oauth/authorize",
15 | "access_token_url": "https://mcp.sentry.dev/oauth/token",
16 | "refresh_token_url": "https://mcp.sentry.dev/oauth/token"
17 | }
18 | ],
19 | "server_metadata": {}
20 | }
21 |
--------------------------------------------------------------------------------
/backend/mcp_servers/notion/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "NOTION",
3 | "url": "https://mcp.notion.com/mcp",
4 | "transport_type": "streamable_http",
5 | "description": "Notion API is a REST API to manage Notion workspaces which are collaborative environments where teams can organize work, manage projects, and store information in a highly customizable way.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/notion.svg",
7 | "categories": ["Productivity", "Document Management"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "",
14 | "authorize_url": "https://mcp.notion.com/authorize",
15 | "access_token_url": "https://mcp.notion.com/token",
16 | "refresh_token_url": "https://mcp.notion.com/token"
17 | }
18 | ],
19 | "server_metadata": {}
20 | }
21 |
--------------------------------------------------------------------------------
/backend/mcp_servers/open_weather_map/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "OPEN_WEATHER_MAP",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=OPEN_WEATHER_MAP",
4 | "transport_type": "streamable_http",
5 | "description": "OpenWeatherMap provides comprehensive weather data including current conditions and 5-day/3-hour forecasts. The API delivers accurate weather information based on the proprietary OpenWeather Model. This integration uses the free API endpoints (Current Weather Data and 5-day/3-hour Forecast) which are available on the free plan with a limit of 1,000 calls per day.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/open_weather_map.svg",
7 | "categories": ["Weather"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "query",
12 | "name": "appid"
13 | }
14 | ],
15 | "server_metadata": {
16 | "is_virtual_mcp_server": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/backend/mcp_servers/clickup/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "CLICKUP",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=CLICKUP",
4 | "transport_type": "streamable_http",
5 | "description": "The ClickUp API allows you to interact with ClickUp programmatically, including workspace management, tasks, lists, folders, and more.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/clickup.png",
7 | "categories": ["Productivity"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "",
14 | "authorize_url": "https://app.clickup.com/api",
15 | "access_token_url": "https://api.clickup.com/api/v2/oauth/token",
16 | "refresh_token_url": "https://api.clickup.com/api/v2/oauth/token"
17 | }
18 | ],
19 | "server_metadata": {
20 | "is_virtual_mcp_server": true
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/backend/mcp_servers/google_tasks/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "GOOGLE_TASKS",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=GOOGLE_TASKS",
4 | "transport_type": "streamable_http",
5 | "description": "The Google Tasks API allows managing tasks and task lists programmatically.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/google_tasks.svg",
7 | "categories": ["Productivity"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "https://www.googleapis.com/auth/tasks",
14 | "authorize_url": "https://accounts.google.com/o/oauth2/v2/auth",
15 | "access_token_url": "https://oauth2.googleapis.com/token",
16 | "refresh_token_url": "https://oauth2.googleapis.com/token"
17 | }
18 | ],
19 | "server_metadata": {
20 | "is_virtual_mcp_server": true
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/backend/aci/common/schemas/mcp_server_bundle.py:
--------------------------------------------------------------------------------
1 | from datetime import datetime
2 | from uuid import UUID
3 |
4 | from pydantic import BaseModel, ConfigDict, Field
5 |
6 | from aci.common.schemas.mcp_server_configuration import MCPServerConfigurationPublic
7 | from aci.common.schemas.user import UserPublic
8 |
9 |
10 | class MCPServerBundleCreate(BaseModel):
11 | name: str
12 | description: str | None = None
13 | mcp_server_configuration_ids: list[UUID] = Field(..., min_length=1)
14 |
15 |
16 | class MCPServerBundlePublic(BaseModel):
17 | model_config = ConfigDict(extra="forbid")
18 |
19 | id: UUID
20 | name: str
21 | description: str | None = None
22 | user_id: UUID
23 | organization_id: UUID
24 | mcp_server_configurations: list[MCPServerConfigurationPublic]
25 | user: UserPublic
26 |
27 | created_at: datetime
28 | updated_at: datetime
29 |
30 |
31 | class MCPServerBundlePublicWithBundleKey(MCPServerBundlePublic):
32 | bundle_key: str
33 |
--------------------------------------------------------------------------------
/backend/mcp_servers/neon/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "NEON",
3 | "url": "https://mcp.neon.tech/mcp",
4 | "transport_type": "streamable_http",
5 | "description": "The Neon MCP Server is an open-source tool that lets you interact with your Neon Postgres databases in natural language",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/neon.svg",
7 | "categories": ["Dev Tools"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "",
14 | "authorize_url": "https://mcp.neon.tech/authorize",
15 | "access_token_url": "https://mcp.neon.tech/token",
16 | "refresh_token_url": "https://mcp.neon.tech/token"
17 | },
18 | {
19 | "type": "api_key",
20 | "location": "header",
21 | "name": "Authorization",
22 | "prefix": "Bearer"
23 | }
24 | ],
25 | "server_metadata": {}
26 | }
27 |
--------------------------------------------------------------------------------
/frontend/sentry.server.config.ts:
--------------------------------------------------------------------------------
1 | // This file configures the initialization of Sentry on the server.
2 | // The config you add here will be used whenever the server handles a request.
3 | // https://docs.sentry.io/platforms/javascript/guides/nextjs/
4 |
5 | import * as Sentry from "@sentry/nextjs";
6 | import { SentryOptions } from "./sentryoptions";
7 |
8 | if (process.env.NEXT_PUBLIC_ENVIRONMENT && process.env.NEXT_PUBLIC_ENVIRONMENT !== "local") {
9 | Sentry.init({
10 | dsn: process.env.NEXT_PUBLIC_SENTRY_DSN || "",
11 |
12 | // Define how likely traces are sampled. Adjust this value in production, or use tracesSampler for greater control.
13 | tracesSampleRate:
14 | SentryOptions[process.env.NEXT_PUBLIC_ENVIRONMENT as "development" | "production"]
15 | .tracesSampleRate,
16 |
17 | sendDefaultPii: true,
18 | // Setting this option to true will print useful information to the console while you're setting up Sentry.
19 | debug: false,
20 | });
21 | }
22 |
--------------------------------------------------------------------------------
/backend/mcp_servers/gmail/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "GMAIL",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=GMAIL",
4 | "transport_type": "streamable_http",
5 | "description": "The Gmail API is a RESTful API that enables sending, reading, and managing emails. This integration allows sending emails on behalf of the user.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/gmail.svg",
7 | "categories": ["Communication"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "https://mail.google.com/",
14 | "authorize_url": "https://accounts.google.com/o/oauth2/v2/auth",
15 | "access_token_url": "https://oauth2.googleapis.com/token",
16 | "refresh_token_url": "https://oauth2.googleapis.com/token"
17 | }
18 | ],
19 | "server_metadata": {
20 | "is_virtual_mcp_server": true
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/backend/aci/control_plane/routes/mcp_tools.py:
--------------------------------------------------------------------------------
1 | from typing import Annotated
2 |
3 | from fastapi import APIRouter, Depends, HTTPException
4 |
5 | from aci.common.db import crud
6 | from aci.common.logging_setup import get_logger
7 | from aci.common.schemas.mcp_tool import MCPToolPublic
8 | from aci.control_plane import dependencies as deps
9 |
10 | logger = get_logger(__name__)
11 | router = APIRouter()
12 |
13 |
14 | @router.get("/{mcp_tool_name}", response_model=MCPToolPublic, response_model_exclude_none=True)
15 | async def get_mcp_tool(
16 | context: Annotated[deps.RequestContext, Depends(deps.get_request_context)],
17 | mcp_tool_name: str,
18 | ) -> MCPToolPublic:
19 | mcp_tool = crud.mcp_tools.get_mcp_tool_by_name(
20 | context.db_session, mcp_tool_name, throw_error_if_not_found=False
21 | )
22 | if mcp_tool is None:
23 | raise HTTPException(status_code=404, detail="MCP tool not found")
24 |
25 | return MCPToolPublic.model_validate(mcp_tool, from_attributes=True)
26 |
--------------------------------------------------------------------------------
/backend/mcp_servers/calendly/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "CALENDLY",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=CALENDLY",
4 | "transport_type": "streamable_http",
5 | "description": "Calendly integration for scheduling and managing meetings. This app allows you to automate your scheduling process, embed Calendly on your website, and manage your availability.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/calendly.svg",
7 | "categories": ["Productivity"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "default",
14 | "authorize_url": "https://auth.calendly.com/oauth/authorize",
15 | "access_token_url": "https://auth.calendly.com/oauth/token",
16 | "refresh_token_url": "https://auth.calendly.com/oauth/token"
17 | }
18 | ],
19 | "server_metadata": {
20 | "is_virtual_mcp_server": true
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/frontend/src/features/logs/api/logs.service.ts:
--------------------------------------------------------------------------------
1 | import { fetcherWithAuth } from "@/lib/api-client";
2 | import { CONTROL_PLANE_PATH } from "@/config/api.constants";
3 | import { MCPToolCallLog, CursorPaginationResponse, LogsFilterParams } from "../types/logs.types";
4 |
5 | export const logsService = {
6 | getToolCallLogs: async (
7 | token: string,
8 | params?: LogsFilterParams,
9 | ): Promise> => {
10 | const queryParams: Record = {};
11 |
12 | if (params?.cursor) queryParams.cursor = params.cursor;
13 | if (params?.mcp_tool_name) queryParams.mcp_tool_name = params.mcp_tool_name;
14 | if (params?.start_timestamp) queryParams.start_time = params.start_timestamp;
15 | if (params?.end_timestamp) queryParams.end_time = params.end_timestamp;
16 |
17 | return fetcherWithAuth>(token)(
18 | `${CONTROL_PLANE_PATH}/logs/tool-calls`,
19 | {
20 | params: queryParams,
21 | },
22 | );
23 | },
24 | };
25 |
--------------------------------------------------------------------------------
/frontend/src/components/data-table/data-table-advanced-toolbar.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import type { Table } from "@tanstack/react-table";
4 | import type * as React from "react";
5 |
6 | import { DataTableViewOptions } from "@/components/data-table/data-table-view-options";
7 | import { cn } from "@/lib/utils";
8 |
9 | interface DataTableAdvancedToolbarProps extends React.ComponentProps<"div"> {
10 | table: Table;
11 | }
12 |
13 | export function DataTableAdvancedToolbar({
14 | table,
15 | children,
16 | className,
17 | ...props
18 | }: DataTableAdvancedToolbarProps) {
19 | return (
20 |
26 |
{children}
27 |
28 |
29 |
30 |
31 | );
32 | }
33 |
--------------------------------------------------------------------------------
/backend/aci/common/url_utils.py:
--------------------------------------------------------------------------------
1 | """Utilities for working with URLs and redirect paths."""
2 |
3 | from __future__ import annotations
4 |
5 | from urllib.parse import urlparse
6 |
7 |
8 | def sanitize_redirect_path(path: str | None) -> str | None:
9 | """Return a safe redirect path rooted at the current origin.
10 |
11 | The function mirrors the frontend logic by ensuring the path starts with a
12 | single forward slash, does not contain a scheme or different host, and
13 | preserves any query string or fragment components.
14 | """
15 | if not path:
16 | return None
17 |
18 | trimmed = path.strip()
19 | if not trimmed.startswith("/") or trimmed.startswith("//"):
20 | return None
21 |
22 | parsed = urlparse(trimmed)
23 | if parsed.scheme or parsed.netloc:
24 | return None
25 |
26 | sanitized = parsed.path or "/"
27 | if parsed.query:
28 | sanitized = f"{sanitized}?{parsed.query}"
29 | if parsed.fragment:
30 | sanitized = f"{sanitized}#{parsed.fragment}"
31 |
32 | return sanitized
33 |
--------------------------------------------------------------------------------
/backend/mcp_servers/google_sheets/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "GOOGLE_SHEETS",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=GOOGLE_SHEETS",
4 | "transport_type": "streamable_http",
5 | "description": "The Google Sheets API is a RESTful API that allows programmatic access to spreadsheet data and formatting. It supports CRUD operations, formulas, charts, and collaboration features.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/google_sheets.svg",
7 | "categories": ["Data & Analytics", "Productivity"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "https://www.googleapis.com/auth/spreadsheets",
14 | "authorize_url": "https://accounts.google.com/o/oauth2/v2/auth",
15 | "access_token_url": "https://oauth2.googleapis.com/token",
16 | "refresh_token_url": "https://oauth2.googleapis.com/token"
17 | }
18 | ],
19 | "server_metadata": {
20 | "is_virtual_mcp_server": true
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/backend/mcp_servers/reddit/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "REDDIT",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=REDDIT",
4 | "transport_type": "streamable_http",
5 | "description": "The Reddit API allows you to interact with Reddit programmatically, including post management, comments, user interactions, and subreddit operations.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/reddit.svg",
7 | "categories": ["Communication"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "identity read vote submit flair edit history mysubreddits",
14 | "authorize_url": "https://www.reddit.com/api/v1/authorize",
15 | "access_token_url": "https://www.reddit.com/api/v1/access_token",
16 | "refresh_token_url": "https://www.reddit.com/api/v1/access_token",
17 | "token_endpoint_auth_method": "client_secret_basic"
18 | }
19 | ],
20 | "server_metadata": {
21 | "is_virtual_mcp_server": true
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/backend/mcp_servers/github/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "GITHUB",
3 | "url": "https://api.githubcopilot.com/mcp",
4 | "transport_type": "streamable_http",
5 | "description": "The GitHub API allows you to interact with GitHub programmatically, including repository management, pull requests, issues, commits, and more.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/github.svg",
7 | "categories": ["Dev Tools"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "repo delete_repo admin:org gist user workflow",
14 | "authorize_url": "https://github.com/login/oauth/authorize",
15 | "access_token_url": "https://github.com/login/oauth/access_token",
16 | "refresh_token_url": "https://github.com/login/oauth/access_token"
17 | },
18 | {
19 | "type": "api_key",
20 | "location": "header",
21 | "name": "Authorization",
22 | "prefix": "Bearer"
23 | }
24 | ],
25 | "server_metadata": {}
26 | }
27 |
--------------------------------------------------------------------------------
/backend/mcp_servers/google_docs/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "GOOGLE_DOCS",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=GOOGLE_DOCS",
4 | "transport_type": "streamable_http",
5 | "description": "The Google Docs API allows developers to create, read, and update Google Docs documents programmatically. It provides access to Google Docs through RESTful HTTP calls, including create, read and update the Google Docs document.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/google_docs.svg",
7 | "categories": ["Document Management"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "https://www.googleapis.com/auth/documents",
14 | "authorize_url": "https://accounts.google.com/o/oauth2/v2/auth",
15 | "access_token_url": "https://oauth2.googleapis.com/token",
16 | "refresh_token_url": "https://oauth2.googleapis.com/token"
17 | }
18 | ],
19 | "server_metadata": {
20 | "is_virtual_mcp_server": true
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/backend/aci/alembic/versions/2025_08_31_1957-7ace8fa6021e_add_transport_type_to_mcpserver.py:
--------------------------------------------------------------------------------
1 | """add transport_type to MCPServer
2 |
3 | Revision ID: 7ace8fa6021e
4 | Revises: 6e960597029b
5 | Create Date: 2025-08-31 19:57:02.769530+00:00
6 |
7 | """
8 | from typing import Sequence, Union
9 |
10 | from alembic import op
11 | import sqlalchemy as sa
12 |
13 |
14 | # revision identifiers, used by Alembic.
15 | revision: str = '7ace8fa6021e'
16 | down_revision: Union[str, None] = '6e960597029b'
17 | branch_labels: Union[str, Sequence[str], None] = None
18 | depends_on: Union[str, Sequence[str], None] = None
19 |
20 |
21 | def upgrade() -> None:
22 | # ### commands auto generated by Alembic - please adjust! ###
23 | op.add_column('mcp_servers', sa.Column('transport_type', sa.Enum('STREAMABLE_HTTP', 'SSE', name='mcpservertransporttype', native_enum=False, length=50), nullable=False))
24 | # ### end Alembic commands ###
25 |
26 |
27 | def downgrade() -> None:
28 | # ### commands auto generated by Alembic - please adjust! ###
29 | op.drop_column('mcp_servers', 'transport_type')
30 | # ### end Alembic commands ###
31 |
--------------------------------------------------------------------------------
/backend/mcp_servers/atlassian/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ATLASSIAN",
3 | "url": "https://mcp.atlassian.com/v1/sse",
4 | "transport_type": "sse",
5 | "description": "The Atlassian Rovo MCP Server is a cloud-based bridge between your Atlassian Cloud site and compatible external tools. Once configured, it enables those tools to interact with Jira, Compass, and Confluence data in real-time.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/atlassian.svg",
7 | "categories": ["Dev Tools", "Project Management", "Documentation"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "",
14 | "authorize_url": "https://mcp.atlassian.com/v1/authorize",
15 | "access_token_url": "https://atlassian-remote-mcp-production.atlassian-remote-mcp-server-production.workers.dev/v1/token",
16 | "refresh_token_url": "https://atlassian-remote-mcp-production.atlassian-remote-mcp-server-production.workers.dev/v1/token"
17 | }
18 | ],
19 | "server_metadata": {}
20 | }
21 |
--------------------------------------------------------------------------------
/frontend/sentry.edge.config.ts:
--------------------------------------------------------------------------------
1 | // This file configures the initialization of Sentry for edge features (middleware, edge routes, and so on).
2 | // The config you add here will be used whenever one of the edge features is loaded.
3 | // Note that this config is unrelated to the Vercel Edge Runtime and is also required when running locally.
4 | // https://docs.sentry.io/platforms/javascript/guides/nextjs/
5 |
6 | import * as Sentry from "@sentry/nextjs";
7 | import { SentryOptions } from "./sentryoptions";
8 |
9 | if (process.env.NEXT_PUBLIC_ENVIRONMENT && process.env.NEXT_PUBLIC_ENVIRONMENT !== "local") {
10 | Sentry.init({
11 | dsn: process.env.NEXT_PUBLIC_SENTRY_DSN || "",
12 |
13 | // Define how likely traces are sampled. Adjust this value in production, or use tracesSampler for greater control.
14 | tracesSampleRate:
15 | SentryOptions[process.env.NEXT_PUBLIC_ENVIRONMENT as "development" | "production"]
16 | .tracesSampleRate,
17 |
18 | sendDefaultPii: true,
19 | // Setting this option to true will print useful information to the console while you're setting up Sentry.
20 | debug: false,
21 | });
22 | }
23 |
--------------------------------------------------------------------------------
/backend/mcp_servers/google_analytics_admin/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "GOOGLE_ANALYTICS_ADMIN",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=GOOGLE_ANALYTICS_ADMIN",
4 | "transport_type": "streamable_http",
5 | "description": "The Google Analytics Admin API allows for programmatic access to the Google Analytics configuration data and is only compatible with Google Analytics properties.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/google_analytics.svg",
7 | "categories": ["Data & Analytics", "Marketing"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "https://www.googleapis.com/auth/analytics.readonly https://www.googleapis.com/auth/analytics.edit",
14 | "authorize_url": "https://accounts.google.com/o/oauth2/v2/auth",
15 | "access_token_url": "https://oauth2.googleapis.com/token",
16 | "refresh_token_url": "https://oauth2.googleapis.com/token"
17 | }
18 | ],
19 | "server_metadata": {
20 | "is_virtual_mcp_server": true
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/.github/workflows/frontend-checks.yml:
--------------------------------------------------------------------------------
1 | name: Frontend Checks
2 |
3 | on:
4 | push:
5 | branches: [main]
6 | pull_request:
7 | branches: [main]
8 |
9 | jobs:
10 | lint:
11 | name: Lint & Format & Build Check
12 | runs-on: ubuntu-latest
13 |
14 | steps:
15 | - name: Checkout code
16 | uses: actions/checkout@v4
17 |
18 | - name: Setup pnpm
19 | uses: pnpm/action-setup@v4
20 | with:
21 | version: 10.14.0
22 |
23 | - name: Setup Node.js
24 | uses: actions/setup-node@v4
25 | with:
26 | node-version: "20"
27 | cache: "pnpm"
28 | cache-dependency-path: frontend/pnpm-lock.yaml
29 |
30 | - name: Install Dependencies
31 | working-directory: frontend
32 | run: pnpm install --frozen-lockfile
33 |
34 | - name: Run ESLint
35 | working-directory: frontend
36 | run: pnpm run lint
37 |
38 | - name: Check Prettier Formatting
39 | working-directory: frontend
40 | run: pnpm run format:check
41 |
42 | - name: Build Frontend
43 | working-directory: frontend
44 | run: pnpm run build
45 |
--------------------------------------------------------------------------------
/backend/mcp_servers/microsoft_onedrive/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "MICROSOFT_ONEDRIVE",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=MICROSOFT_ONEDRIVE",
4 | "transport_type": "streamable_http",
5 | "description": "The Microsoft Graph OneDrive API enables access to files and folders stored in OneDrive. This integration allows reading, managing, and searching OneDrive content on behalf of the user.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/onedrive.svg",
7 | "categories": ["Productivity", "File Storage"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "Files.ReadWrite User.Read offline_access",
14 | "authorize_url": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
15 | "access_token_url": "https://login.microsoftonline.com/common/oauth2/v2.0/token",
16 | "refresh_token_url": "https://login.microsoftonline.com/common/oauth2/v2.0/token"
17 | }
18 | ],
19 | "server_metadata": {
20 | "is_virtual_mcp_server": true
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/backend/aci/control_plane/tests/dummy_mcp_servers/github/tools.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name": "GITHUB__CREATE_REPOSITORY",
4 | "description": "Create a new repository.",
5 | "tags": [],
6 | "tool_metadata": {
7 | "canonical_tool_name": "create-repository",
8 | "canonical_tool_description_hash": "dummy_canonical_tool_description_hash",
9 | "canonical_tool_input_schema_hash": "dummy_canonical_tool_input_schema_hash"
10 | },
11 | "input_schema": {
12 | "type": "object",
13 | "properties": {
14 | "name": {
15 | "type": "string",
16 | "minLength": 1,
17 | "description": "Name of the repository"
18 | },
19 | "description": {
20 | "type": "string",
21 | "description": "Description of the repository"
22 | }
23 | },
24 | "required": [
25 | "name"
26 | ],
27 | "additionalProperties": false,
28 | "$schema": "http://json-schema.org/draft-07/schema#"
29 | }
30 | }
31 | ]
32 |
--------------------------------------------------------------------------------
/backend/mcp_servers/microsoft_outlook/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "MICROSOFT_OUTLOOK",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=MICROSOFT_OUTLOOK",
4 | "transport_type": "streamable_http",
5 | "description": "The Microsoft Graph Outlook API enables access to Microsoft Outlook data including emails, folders, contacts, and mail settings. This integration allows reading and managing Outlook content on behalf of the user.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/outlook.svg",
7 | "categories": ["Communication", "Productivity"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "User.Read Mail.ReadWrite Mail.Send offline_access",
14 | "authorize_url": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
15 | "access_token_url": "https://login.microsoftonline.com/common/oauth2/v2.0/token",
16 | "refresh_token_url": "https://login.microsoftonline.com/common/oauth2/v2.0/token"
17 | }
18 | ],
19 | "server_metadata": {
20 | "is_virtual_mcp_server": true
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/backend/mcp_servers/microsoft_calendar/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "MICROSOFT_CALENDAR",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=MICROSOFT_CALENDAR",
4 | "transport_type": "streamable_http",
5 | "description": "The Microsoft Graph Calendar API enables access to Microsoft Calendar data including events, calendars, and scheduling. This integration allows reading and managing calendar content on behalf of the user.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/outlook.svg",
7 | "categories": ["Productivity", "Scheduling"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "User.Read Calendars.Read Calendars.ReadWrite offline_access",
14 | "authorize_url": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
15 | "access_token_url": "https://login.microsoftonline.com/common/oauth2/v2.0/token",
16 | "refresh_token_url": "https://login.microsoftonline.com/common/oauth2/v2.0/token"
17 | }
18 | ],
19 | "server_metadata": {
20 | "is_virtual_mcp_server": true
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/frontend/src/features/logs/types/logs.types.ts:
--------------------------------------------------------------------------------
1 | export enum MCPToolCallStatus {
2 | SUCCESS = "SUCCESS",
3 | ERROR = "ERROR",
4 | }
5 |
6 | export interface MCPToolCallLog {
7 | id: string;
8 | organization_id: string;
9 | user_id: string;
10 | request_id: string;
11 | session_id: string;
12 | bundle_name: string;
13 | bundle_id: string;
14 | mcp_server_name: string | null;
15 | mcp_server_id: string | null;
16 | mcp_tool_name: string | null;
17 | mcp_tool_id: string | null;
18 | mcp_server_configuration_name: string | null;
19 | mcp_server_configuration_id: string | null;
20 | arguments: string | null;
21 | result: Record;
22 | status: MCPToolCallStatus;
23 | via_execute_tool: boolean;
24 | jsonrpc_payload: Record;
25 | started_at: string;
26 | ended_at: string;
27 | duration_ms: number;
28 | created_at: string;
29 | updated_at: string;
30 | }
31 |
32 | export interface CursorPaginationResponse {
33 | data: T[];
34 | next_cursor: string | null;
35 | }
36 |
37 | export interface LogsFilterParams {
38 | cursor?: string;
39 | mcp_tool_name?: string;
40 | start_timestamp?: string;
41 | end_timestamp?: string;
42 | }
43 |
--------------------------------------------------------------------------------
/backend/mcp_servers/exa/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "EXA",
3 | "url": "https://mcp.exa.ai/mcp",
4 | "transport_type": "streamable_http",
5 | "description": "Exa is a search engine made for AIs. Exa finds the exact content you’re looking for on the web, with five core functionalities:\n/search ->\nFind webpages using Exa’s embeddings-based or Google-style keyword search.\n/contents ->\nObtain clean, up-to-date, parsed HTML from Exa search results.\n/findsimilar ->\nBased on a link, find and return pages that are similar in meaning.\n/answer ->\nGet direct answers to questions using Exa’s Answer API.\n/research ->\nAutomate in-depth web research and receive structured JSON results with citations.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/exa.svg",
7 | "categories": ["Search"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "scope": "",
13 | "authorize_url": "https://mcp.exa.ai/auth/authorize",
14 | "access_token_url": "https://mcp.exa.ai/auth/token",
15 | "refresh_token_url": "https://mcp.exa.ai/auth/token"
16 | }
17 | ],
18 | "server_metadata": {}
19 | }
20 |
--------------------------------------------------------------------------------
/frontend/src/features/settings/components/settings-item.tsx:
--------------------------------------------------------------------------------
1 | import { LucideIcon } from "lucide-react";
2 | import { IconType } from "react-icons";
3 | import { Label } from "@/components/ui/label";
4 | import { ReactNode } from "react";
5 |
6 | interface SettingsItemProps {
7 | icon: LucideIcon | IconType;
8 | label: string;
9 | description?: ReactNode;
10 | children?: ReactNode;
11 | iconClassName?: string;
12 | containerClassName?: string;
13 | }
14 |
15 | export function SettingsItem({
16 | icon: Icon,
17 | label,
18 | description,
19 | children,
20 | iconClassName = "text-primary",
21 | containerClassName = "bg-primary/10",
22 | }: SettingsItemProps) {
23 | return (
24 |
25 |
28 |
29 |
30 |
31 |
32 | {description &&
{description}
}
33 |
34 | {children}
35 |
36 | );
37 | }
38 |
--------------------------------------------------------------------------------
/backend/aci/virtual_mcp/executors/connectors/vercel.py:
--------------------------------------------------------------------------------
1 | import json
2 |
3 | from mcp import types as mcp_types
4 |
5 | from aci.common.logging_setup import get_logger
6 | from aci.common.schemas.virtual_mcp import VirtualMCPAuthTokenData
7 | from aci.virtual_mcp.executors.connectors.base import BaseConnector
8 |
9 | logger = get_logger(__name__)
10 |
11 |
12 | class Vercel(BaseConnector):
13 | def __init__(
14 | self,
15 | auth_token_data: VirtualMCPAuthTokenData,
16 | ):
17 | super().__init__(auth_token_data)
18 | self.api_key = auth_token_data.token
19 |
20 | def get_url_to_install_vercel_app_in_github(self) -> mcp_types.CallToolResult:
21 | """
22 | Get the URL to install the Vercel app in a GitHub repository.
23 | """
24 | result = {
25 | "url": "https://github.com/apps/vercel/installations/select_target",
26 | "description": "Asks the user to use this URL to install the Vercel app in their GitHub account.", # noqa: E501
27 | }
28 | return mcp_types.CallToolResult(
29 | structuredContent=result,
30 | content=[mcp_types.TextContent(type="text", text=json.dumps(result))],
31 | )
32 |
--------------------------------------------------------------------------------
/backend/mcp_servers/share_point/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "SHARE_POINT",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=SHARE_POINT",
4 | "transport_type": "streamable_http",
5 | "description": "The Microsoft Graph SharePoint API enables access to SharePoint sites, lists, libraries, and files. This integration allows reading and managing SharePoint content on behalf of the user.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/sharepoint.png",
7 | "categories": ["Productivity", "Document Management"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "Sites.Manage.All Sites.Read.All Sites.ReadWrite.All Sites.Selected Files.ReadWrite.All User.Read offline_access",
14 | "authorize_url": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
15 | "access_token_url": "https://login.microsoftonline.com/common/oauth2/v2.0/token",
16 | "refresh_token_url": "https://login.microsoftonline.com/common/oauth2/v2.0/token"
17 | }
18 | ],
19 | "server_metadata": {
20 | "is_virtual_mcp_server": true
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/backend/mcp_servers/google_calendar/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "GOOGLE_CALENDAR",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=GOOGLE_CALENDAR",
4 | "transport_type": "streamable_http",
5 | "description": "The Google Calendar API is a RESTful API that can be accessed through explicit HTTP calls. The API exposes most of the features available in the Google Calendar Web interface.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/google_calendar.svg",
7 | "categories": ["Productivity"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "https://www.googleapis.com/auth/calendar https://www.googleapis.com/auth/calendar.events https://www.googleapis.com/auth/calendar.settings.readonly https://www.googleapis.com/auth/calendar.freebusy",
14 | "authorize_url": "https://accounts.google.com/o/oauth2/v2/auth",
15 | "access_token_url": "https://oauth2.googleapis.com/token",
16 | "refresh_token_url": "https://oauth2.googleapis.com/token"
17 | }
18 | ],
19 | "server_metadata": {
20 | "is_virtual_mcp_server": true
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/backend/mcp_servers/x/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "X",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=X",
4 | "transport_type": "streamable_http",
5 | "description": "X API v2 integration for accessing posts, users, communities, trends, and social interactions. Provides programmatic access to X's global conversation with real-time data and advanced analytics.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/x.svg",
7 | "categories": ["Social Media", "Communication", "Analytics"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "tweet.read tweet.write users.read follows.read follows.write like.read like.write bookmark.read bookmark.write list.read list.write mute.read mute.write block.read block.write space.read tweet.moderate.write offline.access",
14 | "authorize_url": "https://x.com/i/oauth2/authorize",
15 | "access_token_url": "https://api.x.com/2/oauth2/token",
16 | "refresh_token_url": "https://api.x.com/2/oauth2/token"
17 | }
18 | ],
19 | "server_metadata": {
20 | "is_virtual_mcp_server": true
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/frontend/src/components/ui-extensions/enhanced-data-table/row-selection-column.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { createColumnHelper, type ColumnDef } from "@tanstack/react-table";
4 | import { Checkbox } from "@/components/ui/checkbox";
5 |
6 | export function getRowSelectionColumn(): ColumnDef {
7 | const columnHelper = createColumnHelper();
8 | return columnHelper.display({
9 | id: "select",
10 | header: ({ table }) => (
11 |
12 | {
18 | table.toggleAllRowsSelected(Boolean(value));
19 | }}
20 | aria-label="Select all"
21 | />
22 |
23 | ),
24 | cell: ({ row }) => (
25 |
26 | {
29 | row.toggleSelected(Boolean(value));
30 | }}
31 | />
32 |
33 | ),
34 | });
35 | }
36 |
--------------------------------------------------------------------------------
/backend/aci/alembic/versions/2025_09_01_2212-63224673a97a_add_name_and_description_to_.py:
--------------------------------------------------------------------------------
1 | """add name and description to MCPServerConfiguration
2 |
3 | Revision ID: 63224673a97a
4 | Revises: 7ace8fa6021e
5 | Create Date: 2025-09-01 22:12:16.288119+00:00
6 |
7 | """
8 | from typing import Sequence, Union
9 |
10 | from alembic import op
11 | import sqlalchemy as sa
12 |
13 |
14 | # revision identifiers, used by Alembic.
15 | revision: str = '63224673a97a'
16 | down_revision: Union[str, None] = '7ace8fa6021e'
17 | branch_labels: Union[str, Sequence[str], None] = None
18 | depends_on: Union[str, Sequence[str], None] = None
19 |
20 |
21 | def upgrade() -> None:
22 | # ### commands auto generated by Alembic - please adjust! ###
23 | op.add_column('mcp_server_configurations', sa.Column('name', sa.String(length=512), nullable=False))
24 | op.add_column('mcp_server_configurations', sa.Column('description', sa.String(length=512), nullable=True))
25 | # ### end Alembic commands ###
26 |
27 |
28 | def downgrade() -> None:
29 | # ### commands auto generated by Alembic - please adjust! ###
30 | op.drop_column('mcp_server_configurations', 'description')
31 | op.drop_column('mcp_server_configurations', 'name')
32 | # ### end Alembic commands ###
33 |
--------------------------------------------------------------------------------
/backend/aci/common/test_utils.py:
--------------------------------------------------------------------------------
1 | import logging
2 | from collections.abc import Generator
3 |
4 | from sqlalchemy.orm import Session
5 |
6 | from aci.common import utils
7 | from aci.common.db.sql_models import Base
8 |
9 | logger = logging.getLogger(__name__)
10 |
11 |
12 | def clear_database(db_session: Session) -> None:
13 | """
14 | Clear all tables in the database except alembic_version.
15 | """
16 | for table in reversed(Base.metadata.sorted_tables):
17 | if table.name != "alembic_version" and db_session.query(table).count() > 0:
18 | logger.debug(f"Deleting all records from table {table.name}")
19 | db_session.execute(table.delete())
20 | db_session.commit()
21 |
22 |
23 | def create_test_db_session(db_host: str, db_full_url: str) -> Generator[Session, None, None]:
24 | """
25 | Create a database session for testing.
26 | Ensures we're using the test database.
27 | Each test gets its own database session for better isolation.
28 | """
29 | assert db_host == "test-db", "Must use test-db for tests"
30 | assert "test" in db_full_url.lower(), "Database URL must contain 'test' for safety"
31 |
32 | with utils.create_db_session(db_full_url) as session:
33 | yield session
34 |
--------------------------------------------------------------------------------
/backend/aci/common/schemas/pagination.py:
--------------------------------------------------------------------------------
1 | from typing import TypeVar
2 |
3 | from pydantic import BaseModel, Field
4 |
5 | T = TypeVar("T")
6 |
7 |
8 | class PaginationParams(BaseModel):
9 | offset: int = Field(default=0, ge=0, description="Offset for pagination")
10 | limit: int = Field(
11 | default=30, ge=1, le=100, description="Limit for pagination, max 100, default 30"
12 | )
13 |
14 |
15 | class PaginationResponse[T](BaseModel):
16 | data: list[T]
17 | offset: int
18 |
19 |
20 | class CursorPaginationParams(BaseModel):
21 | """
22 | Cursor-based pagination parameters
23 | """
24 |
25 | cursor: str | None = Field(
26 | default=None,
27 | description="Opaque cursor for pagination. Use the next_cursor from previous response.",
28 | )
29 | limit: int = Field(
30 | default=50, ge=1, le=100, description="Number of items to return, max 100, default 50"
31 | )
32 |
33 |
34 | class CursorPaginationResponse[T](BaseModel):
35 | """
36 | Cursor-based pagination response with next_cursor for efficient pagination.
37 | """
38 |
39 | data: list[T]
40 | next_cursor: str | None = Field(
41 | default=None, description="Cursor for the next page. None if no more data."
42 | )
43 |
--------------------------------------------------------------------------------
/backend/mcp_servers/google_meet/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "GOOGLE_MEET",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=GOOGLE_MEET",
4 | "transport_type": "streamable_http",
5 | "description": "The Google Meet API allows developers to access and manage Google Meet resources programmatically. It provides information about meetings, participants, and recordings through RESTful HTTP calls including listing conference records, participants, and meeting spaces.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/google_meet.svg",
7 | "categories": ["Video Conferencing"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "https://www.googleapis.com/auth/meetings.space.readonly https://www.googleapis.com/auth/meetings.space.created https://www.googleapis.com/auth/drive.readonly",
14 | "authorize_url": "https://accounts.google.com/o/oauth2/v2/auth",
15 | "access_token_url": "https://oauth2.googleapis.com/token",
16 | "refresh_token_url": "https://oauth2.googleapis.com/token"
17 | }
18 | ],
19 | "server_metadata": {
20 | "is_virtual_mcp_server": true
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/backend/aci/virtual_mcp/executors/connectors/e2b.py:
--------------------------------------------------------------------------------
1 | import json
2 |
3 | from e2b_code_interpreter import Sandbox
4 | from mcp import types as mcp_types
5 |
6 | from aci.common.logging_setup import get_logger
7 | from aci.common.schemas.virtual_mcp import VirtualMCPAuthTokenData
8 | from aci.virtual_mcp.executors.connectors.base import BaseConnector
9 |
10 | logger = get_logger(__name__)
11 |
12 |
13 | class E2b(BaseConnector):
14 | """
15 | E2B.dev Sandbox Connector using Code Interpreter.
16 | """
17 |
18 | def __init__(
19 | self,
20 | auth_token_data: VirtualMCPAuthTokenData,
21 | ):
22 | super().__init__(auth_token_data)
23 | self.api_key = auth_token_data.token
24 |
25 | def run_code(
26 | self,
27 | code: str,
28 | ) -> mcp_types.CallToolResult:
29 | """
30 | Execute code in E2B sandbox and return the result.
31 | """
32 | with Sandbox(api_key=self.api_key) as sandbox:
33 | execution = sandbox.run_code(code)
34 |
35 | result = {"text": execution.text}
36 |
37 | return mcp_types.CallToolResult(
38 | structuredContent=result,
39 | content=[mcp_types.TextContent(type="text", text=json.dumps(result))],
40 | )
41 |
--------------------------------------------------------------------------------
/backend/mcp_servers/linkup/tools.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name": "LINKUP__SEARCH_WEB",
4 | "description": "Search the web in real time using Linkup. Use this tool whenever the user needs trusted facts, news, or source-backed information. Returns comprehensive content from the most relevant sources.",
5 | "tags": [],
6 | "tool_metadata": {
7 | "canonical_tool_name": "search-web",
8 | "canonical_tool_description_hash": "53f2aed70c5567b6681199cc34f0fb3753330ddc04d489a79ecb94a8f997c77c",
9 | "canonical_tool_input_schema_hash": "e603607b621064d67a8b9699efb16db6f6bfa042905f37f2c4ddd58dc5e9d2c0"
10 | },
11 | "input_schema": {
12 | "properties": {
13 | "depth": {
14 | "description": "The search depth to perform. Use 'standard' for queries with likely direct answers. Use 'deep' for complex queries requiring comprehensive analysis or multi-hop questions",
15 | "enum": ["standard", "deep"],
16 | "type": "string"
17 | },
18 | "query": {
19 | "description": "Natural language search query. Full questions work best, e.g., 'How does the new EU AI Act affect startups?'",
20 | "type": "string"
21 | }
22 | },
23 | "required": ["depth", "query"],
24 | "type": "object"
25 | }
26 | }
27 | ]
28 |
--------------------------------------------------------------------------------
/backend/aci/control_plane/tests/dummy_mcp_servers/github/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "GITHUB",
3 | "url": "https://mcp.github.com/mcp",
4 | "transport_type": "streamable_http",
5 | "description": "GitHub is a cloud-based platform that enables developers to store, manage, and share their code repositories. It provides version control using Git, a system that tracks changes to files, allowing multiple people to collaborate on a project efficiently. GitHub facilitates code sharing, collaboration, and management by providing tools for version tracking, branching, and merging of code.",
6 | "logo": "https://example.com/logo.png",
7 | "categories": ["DevTools"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "X-API-Key"
13 | },
14 | {
15 | "type": "oauth2",
16 | "location": "header",
17 | "name": "Authorization",
18 | "prefix": "Bearer",
19 | "client_id": "mock_client_id",
20 | "client_secret": "mock_client_secret",
21 | "scope": "",
22 | "authorize_url": "https://github.com/login/oauth/authorize",
23 | "access_token_url": "https://github.com/login/oauth/access_token",
24 | "refresh_token_url": "https://github.com/login/oauth/access_token"
25 | }
26 | ],
27 | "server_metadata": {}
28 | }
29 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/switch.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import * as React from "react";
4 | import * as SwitchPrimitive from "@radix-ui/react-switch";
5 |
6 | import { cn } from "@/lib/utils";
7 |
8 | function Switch({
9 | className,
10 | ...props
11 | }: React.ComponentProps) {
12 | return (
13 |
21 |
27 |
28 | );
29 | }
30 |
31 | export { Switch };
32 |
--------------------------------------------------------------------------------
/backend/aci/mcp/dependencies.py:
--------------------------------------------------------------------------------
1 | from collections.abc import Generator
2 |
3 | from fastapi import HTTPException, status
4 | from sqlalchemy.exc import TimeoutError as SQLAlchemyTimeoutError
5 | from sqlalchemy.orm import Session
6 |
7 | from aci.common import utils
8 | from aci.common.logging_setup import get_logger
9 | from aci.mcp import config
10 |
11 | logger = get_logger(__name__)
12 |
13 |
14 | def yield_db_session() -> Generator[Session, None, None]:
15 | try:
16 | db_session = utils.create_db_session(config.DB_FULL_URL)
17 | except SQLAlchemyTimeoutError as e:
18 | logger.error(f"Timeout creating database session, likely pool exhausted, error={e}")
19 | raise HTTPException(
20 | status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
21 | detail="Service temporarily unavailable",
22 | ) from e
23 | except Exception as e:
24 | logger.error(f"Failed to create database session, error={e}")
25 | raise HTTPException(
26 | status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
27 | detail="Internal server error",
28 | ) from e
29 |
30 | try:
31 | yield db_session
32 | db_session.commit()
33 | except Exception:
34 | db_session.rollback()
35 | raise
36 | finally:
37 | db_session.close()
38 |
--------------------------------------------------------------------------------
/frontend/src/components/theme-toggle.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import * as React from "react";
4 | import { Moon, Sun } from "lucide-react";
5 | import { useTheme } from "next-themes";
6 |
7 | import { Button } from "@/components/ui/button";
8 | import {
9 | DropdownMenu,
10 | DropdownMenuContent,
11 | DropdownMenuItem,
12 | DropdownMenuTrigger,
13 | } from "@/components/ui/dropdown-menu";
14 |
15 | export function ThemeToggle() {
16 | const { setTheme } = useTheme();
17 |
18 | return (
19 |
20 |
21 |
26 |
27 |
28 | setTheme("light")}>Light
29 | setTheme("dark")}>Dark
30 | setTheme("system")}>System
31 |
32 |
33 | );
34 | }
35 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/formatted-text.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { cn } from "@/lib/utils";
4 |
5 | interface FormattedTextProps {
6 | text: string;
7 | className?: string;
8 | }
9 |
10 | export function FormattedText({ text, className }: FormattedTextProps) {
11 | // Split text by newlines and render each line
12 | const lines = text.split("\n");
13 |
14 | // Filter out empty lines at the beginning and end
15 | const trimmedLines = lines.reduce((acc: string[], line) => {
16 | // Skip empty lines at the beginning
17 | if (acc.length === 0 && line.trim() === "") return acc;
18 |
19 | // Add the line
20 | acc.push(line);
21 |
22 | return acc;
23 | }, []);
24 |
25 | // Remove trailing empty lines
26 | while (
27 | trimmedLines.length > 0 &&
28 | trimmedLines[trimmedLines.length - 1].trim() === ""
29 | ) {
30 | trimmedLines.pop();
31 | }
32 |
33 | return (
34 |
35 | {trimmedLines.map((line, index) => (
36 |
37 | {line.trim() === "" ? (
38 | // Render empty lines as spacers
39 |
40 | ) : (
41 | // Render text lines
42 |
{line}
43 | )}
44 |
45 | ))}
46 |
47 | );
48 | }
49 |
--------------------------------------------------------------------------------
/backend/mcp_servers/youtube/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "YOUTUBE",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=YOUTUBE",
4 | "transport_type": "streamable_http",
5 | "description": "YouTube API provides access to Google's streaming video repository, allowing you to search for videos, retrieve standard feeds, and manage YouTube subscriptions and playlists.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/youtube.svg",
7 | "categories": ["Media"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "https://www.googleapis.com/auth/youtube https://www.googleapis.com/auth/youtube.channel-memberships.creator https://www.googleapis.com/auth/youtube.force-ssl https://www.googleapis.com/auth/youtube.readonly https://www.googleapis.com/auth/youtube.upload https://www.googleapis.com/auth/youtubepartner https://www.googleapis.com/auth/youtubepartner-channel-audit",
14 | "authorize_url": "https://accounts.google.com/o/oauth2/v2/auth",
15 | "access_token_url": "https://oauth2.googleapis.com/token",
16 | "refresh_token_url": "https://oauth2.googleapis.com/token"
17 | }
18 | ],
19 | "server_metadata": {
20 | "is_virtual_mcp_server": true
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/.github/workflows/ecs-build-image.yml:
--------------------------------------------------------------------------------
1 | name: Build Image
2 | on:
3 | workflow_call:
4 | inputs:
5 | ecr_repository_url:
6 | type: string
7 | description: The ECR repository URL to use
8 | required: true
9 | image_tag:
10 | type: string
11 | description: The image tag to use
12 | required: true
13 | dockerfile:
14 | type: string
15 | description: The Dockerfile to use
16 | required: true
17 | jobs:
18 | build:
19 | runs-on: ubuntu-latest
20 | steps:
21 | - name: Checkout Code
22 | uses: actions/checkout@v4
23 |
24 | - name: Configure AWS credentials
25 | uses: aws-actions/configure-aws-credentials@v4
26 | with:
27 | aws-access-key-id: ${{ secrets.CICD_AWS_ACCESS_KEY_ID }}
28 | aws-secret-access-key: ${{ secrets.CICD_AWS_SECRET_ACCESS_KEY }}
29 | aws-region: ${{ vars.CICD_AWS_REGION }}
30 |
31 | - name: Login to Amazon ECR
32 | id: login-ecr
33 | uses: aws-actions/amazon-ecr-login@v2
34 |
35 | - name: Build & Push Image
36 | working-directory: backend
37 | run: |
38 | docker build -f ${{ inputs.dockerfile }} -t ${{ inputs.ecr_repository_url }}:${{ inputs.image_tag }} .
39 | docker push ${{ inputs.ecr_repository_url }}:${{ inputs.image_tag }}
40 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/avatar.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import * as React from "react";
4 | import * as AvatarPrimitive from "@radix-ui/react-avatar";
5 |
6 | import { cn } from "@/lib/utils";
7 |
8 | function Avatar({
9 | className,
10 | ...props
11 | }: React.ComponentProps) {
12 | return (
13 |
21 | );
22 | }
23 |
24 | function AvatarImage({
25 | className,
26 | ...props
27 | }: React.ComponentProps) {
28 | return (
29 |
34 | );
35 | }
36 |
37 | function AvatarFallback({
38 | className,
39 | ...props
40 | }: React.ComponentProps) {
41 | return (
42 |
50 | );
51 | }
52 |
53 | export { Avatar, AvatarImage, AvatarFallback };
54 |
--------------------------------------------------------------------------------
/backend/aci/virtual_mcp/config.py:
--------------------------------------------------------------------------------
1 | from aci.common.enums import Environment
2 | from aci.common.utils import check_and_get_env_variable, construct_db_url
3 |
4 | # FastAPI APP CONFIG
5 | APP_TITLE = "ACI Virtual MCP"
6 | APP_ROOT_PATH = "/virtual"
7 | APP_DOCS_URL = "/docs"
8 | APP_REDOC_URL = "/redoc"
9 | APP_OPENAPI_URL = "/openapi.json"
10 |
11 |
12 | ENVIRONMENT = Environment(check_and_get_env_variable("VIRTUAL_MCP_ENVIRONMENT"))
13 | LOG_LEVEL = check_and_get_env_variable("VIRTUAL_MCP_LOG_LEVEL", default="INFO")
14 |
15 | # ROUTERS
16 | ROUTER_PREFIX_HEALTH = "/health"
17 | ROUTER_PREFIX_MCP = "/mcp"
18 |
19 |
20 | # Authentication
21 | SESSION_SECRET_KEY = check_and_get_env_variable("VIRTUAL_MCP_SESSION_SECRET_KEY")
22 |
23 |
24 | # DB CONFIG
25 | DB_SCHEME = check_and_get_env_variable("VIRTUAL_MCP_DB_SCHEME")
26 | DB_USER = check_and_get_env_variable("VIRTUAL_MCP_DB_USER")
27 | DB_PASSWORD = check_and_get_env_variable("VIRTUAL_MCP_DB_PASSWORD")
28 | DB_HOST = check_and_get_env_variable("VIRTUAL_MCP_DB_HOST")
29 | DB_PORT = check_and_get_env_variable("VIRTUAL_MCP_DB_PORT")
30 | DB_NAME = check_and_get_env_variable("VIRTUAL_MCP_DB_NAME")
31 | DB_FULL_URL = construct_db_url(DB_SCHEME, DB_USER, DB_PASSWORD, DB_HOST, DB_PORT, DB_NAME)
32 |
33 | # 8KB
34 | MAX_LOG_FIELD_SIZE = 8 * 1024
35 |
36 | # Ops
37 | SENTRY_DSN = check_and_get_env_variable("VIRTUAL_MCP_SENTRY_DSN")
38 |
--------------------------------------------------------------------------------
/backend/mcp_servers/discord/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "DISCORD",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=DISCORD",
4 | "transport_type": "streamable_http",
5 | "description": "Discord is a voice, video, and text communication service. This API allows you to interact with Discord in two ways: as a bot for automated tasks and workflows, or as a user to perform actions on behalf of a real Discord user. Whether you're building chatbots, automating workflows, or integrating Discord with other tools, this API provides the flexibility to suit your needs.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/discord.svg",
7 | "categories": ["Communication"],
8 | "auth_configs": [
9 | {
10 | "type": "oauth2",
11 | "client_id": "{{ CLIENT_ID }}",
12 | "client_secret": "{{ CLIENT_SECRET }}",
13 | "scope": "identify email openid connections guilds guilds.join guilds.members.read applications.commands messages.read",
14 | "authorize_url": "https://discord.com/api/oauth2/authorize",
15 | "access_token_url": "https://discord.com/api/oauth2/token",
16 | "refresh_token_url": "https://discord.com/api/oauth2/token",
17 | "token_endpoint_auth_method": "client_secret_post"
18 | }
19 | ],
20 | "server_metadata": {
21 | "is_virtual_mcp_server": true
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/backend/aci/alembic/versions/2025_08_26_1309-6e960597029b_rename_field_mcp_server_configuration_.py:
--------------------------------------------------------------------------------
1 | """rename field mcp_server_configuration_ids
2 |
3 | Revision ID: 6e960597029b
4 | Revises: 5896119a5994
5 | Create Date: 2025-08-26 13:09:43.509860+00:00
6 |
7 | """
8 | from typing import Sequence, Union
9 |
10 | from alembic import op
11 | import sqlalchemy as sa
12 | from sqlalchemy.dialects import postgresql
13 |
14 | # revision identifiers, used by Alembic.
15 | revision: str = '6e960597029b'
16 | down_revision: Union[str, None] = '5896119a5994'
17 | branch_labels: Union[str, Sequence[str], None] = None
18 | depends_on: Union[str, Sequence[str], None] = None
19 |
20 |
21 | def upgrade() -> None:
22 | # ### commands auto generated by Alembic - please adjust! ###
23 | op.add_column('mcp_server_bundles', sa.Column('mcp_server_configuration_ids', sa.ARRAY(sa.UUID()), nullable=False))
24 | op.drop_column('mcp_server_bundles', 'mcp_server_configurations')
25 | # ### end Alembic commands ###
26 |
27 |
28 | def downgrade() -> None:
29 | # ### commands auto generated by Alembic - please adjust! ###
30 | op.add_column('mcp_server_bundles', sa.Column('mcp_server_configurations', postgresql.ARRAY(sa.UUID()), autoincrement=False, nullable=False))
31 | op.drop_column('mcp_server_bundles', 'mcp_server_configuration_ids')
32 | # ### end Alembic commands ###
33 |
--------------------------------------------------------------------------------
/frontend/src/features/settings/hooks/use-cancel-subscription.ts:
--------------------------------------------------------------------------------
1 | import { useMutation } from "@tanstack/react-query";
2 | import { useMetaInfo } from "@/components/context/metainfo";
3 | import { subscriptionApi } from "../api/subscription";
4 | import { toast } from "sonner";
5 | import { useRouter } from "next/navigation";
6 |
7 | export function useCancelSubscription() {
8 | const { activeOrg, accessToken } = useMetaInfo();
9 | const router = useRouter();
10 |
11 | const cancelSubscriptionMutation = useMutation({
12 | mutationFn: () => {
13 | if (!activeOrg?.orgId) {
14 | throw new Error("No organization selected");
15 | }
16 | return subscriptionApi.cancelSubscription(activeOrg.orgId, accessToken);
17 | },
18 | onSuccess: () => {
19 | // Redirect to cancellation success page
20 | // Note: Data invalidation is handled by the cancellation page itself
21 | router.push("/subscription/cancelled");
22 | },
23 | onError: (error) => {
24 | console.error("Error cancelling subscription:", error);
25 | toast.error(
26 | error instanceof Error ? error.message : "Failed to cancel subscription. Please try again.",
27 | );
28 | },
29 | });
30 |
31 | return {
32 | cancelSubscription: cancelSubscriptionMutation.mutate,
33 | isCancelling: cancelSubscriptionMutation.isPending,
34 | };
35 | }
36 |
--------------------------------------------------------------------------------
/backend/aci/control_plane/tests/dummy_mcp_servers/gmail/tools.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name": "GMAIL__SEND_EMAIL",
4 | "description": "Send an email.",
5 | "tags": [],
6 | "tool_metadata": {
7 | "canonical_tool_name": "send-email",
8 | "canonical_tool_description_hash": "dummy_canonical_tool_description_hash",
9 | "canonical_tool_input_schema_hash": "dummy_canonical_tool_input_schema_hash"
10 | },
11 | "input_schema": {
12 | "type": "object",
13 | "properties": {
14 | "title": {
15 | "type": "string",
16 | "minLength": 1,
17 | "description": "Title of the email"
18 | },
19 | "content": {
20 | "type": "string",
21 | "description": "Content of the email"
22 | },
23 | "recipient": {
24 | "type": "string",
25 | "description": "Recipient of the email"
26 | }
27 | },
28 | "required": [
29 | "title",
30 | "content",
31 | "recipient"
32 | ],
33 | "additionalProperties": false,
34 | "$schema": "http://json-schema.org/draft-07/schema#"
35 | }
36 | }
37 | ]
38 |
--------------------------------------------------------------------------------
/frontend/src/components/ui/checkbox.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import * as React from "react";
4 | import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
5 | import { CheckIcon } from "lucide-react";
6 |
7 | import { cn } from "@/lib/utils";
8 |
9 | function Checkbox({
10 | className,
11 | ...props
12 | }: React.ComponentProps) {
13 | return (
14 |
22 |
26 |
27 |
28 |
29 | );
30 | }
31 |
32 | export { Checkbox };
33 |
--------------------------------------------------------------------------------
/frontend/src/features/settings/components/teams-settings.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useState } from "react";
4 | import { Button } from "@/components/ui/button";
5 | import { Plus } from "lucide-react";
6 | import { TeamsTable } from "./teams-table";
7 | import { CreateTeamDialog } from "./create-team-dialog";
8 |
9 | export function TeamsSettings() {
10 | const [createDialogOpen, setCreateDialogOpen] = useState(false);
11 | const [refreshKey, setRefreshKey] = useState(0);
12 |
13 | const handleCreateSuccess = () => {
14 | setCreateDialogOpen(false);
15 | setRefreshKey((prev) => prev + 1);
16 | };
17 |
18 | return (
19 |
20 |
21 |
22 |
Teams
23 |
Manage organization teams and team memberships
24 |
25 |
29 |
30 |
31 |
32 |
33 |
38 |
39 | );
40 | }
41 |
--------------------------------------------------------------------------------
/frontend/src/types/data-table.ts:
--------------------------------------------------------------------------------
1 | import type { ColumnSort, Row, RowData } from "@tanstack/react-table";
2 | import type { DataTableConfig } from "@/config/data-table";
3 | import type { FilterItemSchema } from "@/lib/parsers";
4 |
5 | declare module "@tanstack/react-table" {
6 | // eslint-disable-next-line @typescript-eslint/no-unused-vars
7 | interface ColumnMeta {
8 | label?: string;
9 | placeholder?: string;
10 | variant?: FilterVariant;
11 | options?: Option[];
12 | range?: [number, number];
13 | unit?: string;
14 | icon?: React.FC>;
15 | }
16 | }
17 |
18 | export interface Option {
19 | label: string;
20 | value: string;
21 | count?: number;
22 | icon?: React.FC>;
23 | }
24 |
25 | export type FilterOperator = DataTableConfig["operators"][number];
26 | export type FilterVariant = DataTableConfig["filterVariants"][number];
27 | export type JoinOperator = DataTableConfig["joinOperators"][number];
28 |
29 | export interface ExtendedColumnSort extends Omit {
30 | id: Extract;
31 | }
32 |
33 | export interface ExtendedColumnFilter extends FilterItemSchema {
34 | id: Extract;
35 | }
36 |
37 | export interface DataTableRowAction {
38 | row: Row;
39 | variant: "update" | "delete";
40 | }
41 |
--------------------------------------------------------------------------------
/backend/mcp_servers/figma/server.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "FIGMA",
3 | "url": "https://mcp.aci.dev/virtual/mcp?server_name=FIGMA",
4 | "transport_type": "streamable_http",
5 | "description": "Figma is a browser-based collaborative interface design tool. This integration allows access to and processing of Figma design files and resources.",
6 | "logo": "https://raw.githubusercontent.com/aipotheosis-labs/aipolabs-icons/refs/heads/main/apps/figma.svg",
7 | "categories": ["Media & Design"],
8 | "auth_configs": [
9 | {
10 | "type": "api_key",
11 | "location": "header",
12 | "name": "X-Figma-Token"
13 | },
14 | {
15 | "type": "oauth2",
16 | "client_id": "{{ CLIENT_ID }}",
17 | "client_secret": "{{ CLIENT_SECRET }}",
18 | "scope": "current_user:read file_comments:read file_comments:write file_content:read file_dev_resources:read file_dev_resources:write file_metadata:read file_variables:read file_variables:write file_versions:read files:read library_analytics:read library_assets:read library_content:read projects:read team_library_content:read webhooks:read webhooks:write",
19 | "authorize_url": "https://www.figma.com/oauth",
20 | "access_token_url": "https://api.figma.com/v1/oauth/token",
21 | "refresh_token_url": "https://api.figma.com/v1/oauth/refresh"
22 | }
23 | ],
24 | "server_metadata": {
25 | "is_virtual_mcp_server": true
26 | }
27 | }
28 |
--------------------------------------------------------------------------------