{"name":"faable","version":"4.7.0","endpoint":"https://mcp.faable.com/mcp","transport":"streamable-http","auth":{"type":"api-key","header":"Authorization: Bearer <key>","keys":"https://dashboard.faable.com/settings/projects"},"docs":"https://faable.com/docs/cli#mcp-server","tools":[{"name":"whoami","title":"Who is logged in","description":"The Faable account this server acts as, the active project and its Auth tenant. Use it first when unsure whether the user is logged in or which project is active.","product":"deploy","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false}},{"name":"list_projects","title":"List projects","description":"The user's Faable projects. Apps, domains and Auth tenants live in a project; pass its id as `project` to the other tools.","product":"deploy","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"query":{"description":"Search by name, slug or description","type":"string"},"cursor":{"description":"next_cursor from the previous page, to continue a listing","type":"string"}},"additionalProperties":false}},{"name":"list_apps","title":"List apps","description":"The apps of a project, with their live phase, URL and linked repository. Start here to find the app the user means.","product":"deploy","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"},"cursor":{"description":"next_cursor from the previous page, to continue a listing","type":"string"}},"additionalProperties":false}},{"name":"get_app","title":"Get an app","description":"One app: phase, URL, repository, deploy branch and mode, detected stack, and its newest deployment (which may have failed while an older one keeps serving). Use it to answer 'is my app up?' or 'what is deployed?'.","product":"deploy","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"app":{"type":"string","description":"App id (app_…), name or slug. Names are looked up in the project."},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"}},"required":["app"],"additionalProperties":false}},{"name":"list_deployments","title":"List deployments","description":"Recent deployments of an app, newest first, with phase, commit and the first line of any failure reason. Use it to find the deployment behind 'my last deploy failed'.","product":"deploy","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"app":{"type":"string","description":"App id (app_…), name or slug. Names are looked up in the project."},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"},"limit":{"description":"How many (default 10)","type":"integer","minimum":1,"maximum":50},"cursor":{"description":"next_cursor from the previous page, to continue a listing","type":"string"}},"required":["app"],"additionalProperties":false}},{"name":"get_deployment","title":"Get a deployment","description":"Everything recorded about one deployment: phase, commit, detected stack, the runnable artifact, the FULL failure reason and, when it failed, `fault` — whether it is the user's to fix (`user`) or Faable's (`platform`). Without `deployment`, the newest one of the app.","product":"deploy","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"app":{"type":"string","description":"App id (app_…), name or slug. Names are looked up in the project."},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"},"deployment":{"description":"Deployment id (deployment_…)","type":"string"}},"required":["app"],"additionalProperties":false}},{"name":"get_build_logs","title":"Read build logs","description":"The build output of a deployment — the first thing to read when a deploy failed and the user asks why. The cause is usually at the end. Without `deployment`, the newest one.","product":"deploy","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"app":{"type":"string","description":"App id (app_…), name or slug. Names are looked up in the project."},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"},"deployment":{"description":"Deployment id (deployment_…)","type":"string"},"tail":{"description":"Last N lines (default 200)","type":"integer","minimum":1,"maximum":2000}},"required":["app"],"additionalProperties":false}},{"name":"get_runtime_logs","title":"Read runtime logs","description":"What the running app printed (last 24 hours, up to 200 lines). Use it when the app is up but misbehaving, or crashes after starting. A deployment retired more than a day ago has none — read its build logs instead.","product":"deploy","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"app":{"type":"string","description":"App id (app_…), name or slug. Names are looked up in the project."},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"},"deployment":{"description":"Only this deployment","type":"string"},"tail":{"description":"Last N lines","type":"integer","minimum":1,"maximum":200}},"required":["app"],"additionalProperties":false}},{"name":"get_app_traffic","title":"Read app traffic","description":"Requests the app served: status codes, busiest paths and failing paths. Trails reality by up to 15 minutes.","product":"deploy","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"app":{"type":"string","description":"App id (app_…), name or slug. Names are looked up in the project."},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"},"since":{"description":"How far back: 30m, 24h, 7d (default 24h)","type":"string","pattern":"^\\d+[mhd]$"},"deployment":{"description":"Only what this deployment served","type":"string"}},"required":["app"],"additionalProperties":false}},{"name":"get_usage","title":"Read project usage","description":"This billing period's usage of a project: plan, apps, domains, deployments and egress.","product":"deploy","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"}},"additionalProperties":false}},{"name":"get_quota","title":"Read deploy quota","description":"Today's deploy allowance of a project and the builds held waiting for it. Use it when a deploy did not start: a held build is waiting, not failing.","product":"deploy","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"}},"additionalProperties":false}},{"name":"list_domains","title":"List custom domains","description":"Custom domains of an app and whether their DNS is verified.","product":"deploy","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"app":{"type":"string","description":"App id (app_…), name or slug. Names are looked up in the project."},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"}},"required":["app"],"additionalProperties":false}},{"name":"check_domain","title":"Check a domain","description":"DNS diagnostic of one custom domain: the CNAME it expects, what DNS answers today, and why it is not verified yet.","product":"deploy","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"app":{"type":"string","description":"App id (app_…), name or slug. Names are looked up in the project."},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"},"fqdn":{"type":"string","description":"The domain, e.g. www.example.com"}},"required":["app","fqdn"],"additionalProperties":false}},{"name":"list_secrets","title":"List secret names","description":"The environment variables set on an app. Names only — values are masked and this tool can never reveal them. Use it to check whether a variable the app needs is set.","product":"deploy","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"app":{"type":"string","description":"App id (app_…), name or slug. Names are looked up in the project."},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"}},"required":["app"],"additionalProperties":false}},{"name":"list_auth_tenants","title":"List Auth tenants","description":"The Faable Auth tenants (user directories) of a project. Most projects have one and every Auth tool uses it; with several, pass the right one as `tenant`.","product":"auth","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"}},"additionalProperties":false}},{"name":"list_auth_logins","title":"Recent logins","description":"Who logged in to the app's Faable Auth, newest first: one row per login with the user's email, when, from which IP and with which method. Answers 'who logged in recently?' or 'did X log in today?'. For 'how many', use count_auth_users.","product":"auth","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"since":{"description":"How far back: 30m, 24h, 7d, a date (default 24h)","type":"string","pattern":"^(\\d+[mhd]|\\d{4}-\\d{2}-\\d{2}|\\d{10,})$"},"status":{"description":"Only successful or only failed attempts (default: both)","type":"string","enum":["success","failed"]},"limit":{"description":"How many (default 50)","type":"integer","minimum":1,"maximum":200},"tenant":{"description":"Auth tenant id (account_…). Defaults to the project's tenant (list_auth_tenants when it has several).","type":"string"},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"}},"additionalProperties":false}},{"name":"count_auth_users","title":"Count users","description":"How many users of the Auth tenant match: logged in since a time ('how many users logged in today / this week'), signed up since a time ('how many sign-ups this month'), suspended, or all of them. Counts users, not logins.","product":"auth","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"last_login_since":{"description":"Logged in at or after: 24h, 7d, a date","type":"string","pattern":"^(\\d+[mhd]|\\d{4}-\\d{2}-\\d{2}|\\d{10,})$"},"created_since":{"description":"Signed up at or after: 24h, 7d, a date","type":"string","pattern":"^(\\d+[mhd]|\\d{4}-\\d{2}-\\d{2}|\\d{10,})$"},"created_until":{"description":"Signed up at or before","type":"string","pattern":"^(\\d+[mhd]|\\d{4}-\\d{2}-\\d{2}|\\d{10,})$"},"suspended":{"type":"boolean"},"tenant":{"description":"Auth tenant id (account_…). Defaults to the project's tenant (list_auth_tenants when it has several).","type":"string"},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"}},"additionalProperties":false}},{"name":"list_auth_users","title":"List users","description":"Users of the Auth tenant. Find one by email or text, list the suspended ones, or sort: `-last_login` (most recent login first), `last_login` (longest without logging in), `-logins_count` (most active), `-createdAt` (newest sign-ups, the default). Sorting by last_login leaves out users who never logged in.","product":"auth","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"search":{"description":"Text in name, email or phone","type":"string"},"email":{"description":"Exact email","type":"string"},"suspended":{"type":"boolean"},"sort":{"type":"string","enum":["-last_login","last_login","-logins_count","-createdAt","createdAt"]},"last_login_since":{"description":"Logged in at or after: 24h, 7d, a date","type":"string","pattern":"^(\\d+[mhd]|\\d{4}-\\d{2}-\\d{2}|\\d{10,})$"},"created_since":{"description":"Signed up at or after","type":"string","pattern":"^(\\d+[mhd]|\\d{4}-\\d{2}-\\d{2}|\\d{10,})$"},"limit":{"description":"How many (default 50)","type":"integer","minimum":1,"maximum":200},"cursor":{"description":"next_cursor from the previous page, to continue a listing","type":"string"},"tenant":{"description":"Auth tenant id (account_…). Defaults to the project's tenant (list_auth_tenants when it has several).","type":"string"},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"}},"additionalProperties":false}},{"name":"get_auth_user","title":"Get a user","description":"One user of the Auth tenant by id or email: profile, verification, suspension (and why), last login and login count, and the social identities they sign in with. Use it to confirm who a user is before suspending them, or to see why they can't log in (together with list_auth_logs).","product":"auth","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"user":{"type":"string","description":"User id (user_…) or exact email"},"tenant":{"description":"Auth tenant id (account_…). Defaults to the project's tenant (list_auth_tenants when it has several).","type":"string"},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"}},"required":["user"],"additionalProperties":false}},{"name":"list_auth_logs","title":"Read the Auth audit log","description":"The Auth tenant's audit log, newest first: logins, failed logins (`status: failed`), sign-ups, password resets, admin changes (`type` prefix `admin.user`). Filter by user to answer 'why can't X log in?' — the failed attempts say why.","product":"auth","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"email":{"description":"Only this user's events (exact email)","type":"string"},"user":{"description":"Only this user id (user_…)","type":"string"},"type":{"description":"Exact event type, e.g. user.login, user.signup","type":"string"},"origin":{"description":"Type prefix, e.g. oauth, admin","type":"string"},"status":{"type":"string","enum":["success","failed","skipped","info"]},"since":{"description":"30m, 24h, 7d or a date (default 7d)","type":"string","pattern":"^(\\d+[mhd]|\\d{4}-\\d{2}-\\d{2}|\\d{10,})$"},"until":{"type":"string","pattern":"^(\\d+[mhd]|\\d{4}-\\d{2}-\\d{2}|\\d{10,})$"},"limit":{"description":"How many (default 50)","type":"integer","minimum":1,"maximum":200},"tenant":{"description":"Auth tenant id (account_…). Defaults to the project's tenant (list_auth_tenants when it has several).","type":"string"},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"}},"additionalProperties":false}},{"name":"list_auth_sessions","title":"List a user's sessions","description":"The devices a user is signed in on (one row per login session): IP, device, last activity and whether it is still active.","product":"auth","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"user":{"type":"string","description":"User id (user_…) or exact email"},"active":{"description":"Only active sessions (default true)","type":"boolean"},"tenant":{"description":"Auth tenant id (account_…). Defaults to the project's tenant (list_auth_tenants when it has several).","type":"string"},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"}},"required":["user"],"additionalProperties":false}},{"name":"list_auth_connections","title":"List login methods","description":"How users can log in to the Auth tenant: social providers (Google, GitHub…), passwordless (email or SMS codes) and username/password, and which are enabled.","product":"auth","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"tenant":{"description":"Auth tenant id (account_…). Defaults to the project's tenant (list_auth_tenants when it has several).","type":"string"},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"}},"additionalProperties":false}},{"name":"list_auth_clients","title":"List Auth applications","description":"The applications (OAuth clients) of the Auth tenant: web apps, SPAs, native apps and machine-to-machine clients.","product":"auth","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"search":{"type":"string"},"tenant":{"description":"Auth tenant id (account_…). Defaults to the project's tenant (list_auth_tenants when it has several).","type":"string"},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"}},"additionalProperties":false}},{"name":"list_github_repos","title":"List deployable GitHub repositories","description":"The GitHub repositories Faable can deploy: those the Faable GitHub App is installed on. Use it before create_app to find the repository the user means. When the app is not installed (or the repository is missing), give the user `install_url` — installing it is a step in their browser.","product":"deploy","access":"read","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"query":{"description":"Filter by repository name","type":"string"},"limit":{"type":"integer","minimum":1,"maximum":100}},"additionalProperties":false}},{"name":"deploy_app","title":"Deploy an app","description":"Build and deploy the latest commit of the app's deploy branch on Faable's servers — the same as a git push. Nothing is uploaded from this machine. With `wait`, returns once it is live (with the URL) or failed (with the reason and whether it is the user's code or Faable's); without it, returns the deployment id at once. Only for apps with push-to-deploy.","product":"deploy","access":"deploy","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"app":{"type":"string","description":"App id (app_…), name or slug. Names are looked up in the project."},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"},"wait":{"description":"Wait until live or failed, up to 5 minutes (default false)","type":"boolean"}},"required":["app"],"additionalProperties":false}},{"name":"create_app","title":"Create an app from a repository","description":"Create an app from a GitHub repository in a project, link it and start its first deploy (the dashboard's Create & connect). Needs the Faable GitHub App installed on the repository; if the link fails, the new app is removed and the error says what to fix.","product":"deploy","access":"write","requires":"mode=write","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"repo":{"type":"string","description":"GitHub repository, owner/repo"},"name":{"description":"App name (defaults to the repository name)","type":"string"},"branch":{"description":"Branch to deploy (defaults to the repository default)","type":"string"},"deploy":{"description":"Start the first deploy (default true)","type":"boolean"},"wait":{"description":"Wait for the first deploy to be live (returns the URL) or to fail, up to 5 minutes","type":"boolean"},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"}},"required":["repo"],"additionalProperties":false}},{"name":"redeploy","title":"Retry a failed deployment","description":"Rebuild a failed deployment from the source it recorded. Without `deployment`, the newest failed one. Refused for code older than what production serves.","product":"deploy","access":"write","requires":"mode=write","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"app":{"type":"string","description":"App id (app_…), name or slug. Names are looked up in the project."},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"},"deployment":{"type":"string"}},"required":["app"],"additionalProperties":false}},{"name":"cancel_deployment","title":"Cancel a build","description":"Stop a deployment that is still queued or building. Production keeps serving what it served. Without `deployment`, the one in flight.","product":"deploy","access":"write","requires":"mode=write","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"app":{"type":"string","description":"App id (app_…), name or slug. Names are looked up in the project."},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"},"deployment":{"type":"string"}},"required":["app"],"additionalProperties":false}},{"name":"set_secrets","title":"Set environment variables","description":"Add or update environment variables of an app. The app restarts to apply them when a value changed. Returns the names added, updated and unchanged — never the values.","product":"deploy","access":"write","requires":"mode=write","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"app":{"type":"string","description":"App id (app_…), name or slug. Names are looked up in the project."},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"},"variables":{"type":"object","propertyNames":{"type":"string","pattern":"^[A-Za-z_][A-Za-z0-9_]*$"},"additionalProperties":{"type":"string"},"description":"NAME → value"}},"required":["app","variables"],"additionalProperties":false}},{"name":"add_domain","title":"Add a custom domain","description":"Attach a custom domain to an app. Returns the CNAME record the user must create at their DNS provider; Faable verifies it and issues the certificate on its own.","product":"deploy","access":"write","requires":"mode=write","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"app":{"type":"string","description":"App id (app_…), name or slug. Names are looked up in the project."},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"},"fqdn":{"type":"string","description":"e.g. www.example.com"}},"required":["app","fqdn"],"additionalProperties":false}},{"name":"configure_repo","title":"Configure how an app deploys","description":"Change the deploy branch, the monorepo root directory (\"\" clears it) or the deploy mode (push: every push; ci: once CI tags a release; workflow: the repo's own GitHub workflow). Applies to the next deploy.","product":"deploy","access":"write","requires":"mode=write","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"app":{"type":"string","description":"App id (app_…), name or slug. Names are looked up in the project."},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"},"branch":{"type":"string"},"root_dir":{"type":"string"},"mode":{"type":"string","enum":["push","ci","workflow"]}},"required":["app"],"additionalProperties":false}},{"name":"suspend_auth_user","title":"Suspend a user","description":"Suspend one user of the Auth tenant: they can no longer log in, and their sessions and refresh tokens stop working (access tokens already issued live until they expire). Reversible with reinstate_auth_user. Confirm with get_auth_user that it is the right person first, and say why in `reason` — it is recorded on the user.","product":"auth","access":"write","requires":"mode=write","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"user":{"type":"string","description":"User id (user_…) or exact email"},"reason":{"type":"string","maxLength":512,"description":"Why — recorded on the user"},"tenant":{"description":"Auth tenant id (account_…). Defaults to the project's tenant (list_auth_tenants when it has several).","type":"string"},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"}},"required":["user","reason"],"additionalProperties":false}},{"name":"reinstate_auth_user","title":"Reinstate a user","description":"Lift the suspension of a user: they can log in again.","product":"auth","access":"write","requires":"mode=write","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"user":{"type":"string","description":"User id (user_…) or exact email"},"tenant":{"description":"Auth tenant id (account_…). Defaults to the project's tenant (list_auth_tenants when it has several).","type":"string"},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"}},"required":["user"],"additionalProperties":false}},{"name":"revoke_auth_sessions","title":"Sign a user out everywhere","description":"End every active session of a user (the 'sign out of all devices' button): they have to log in again on each device. Access tokens already issued live until they expire.","product":"auth","access":"write","requires":"mode=write","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"user":{"type":"string","description":"User id (user_…) or exact email"},"tenant":{"description":"Auth tenant id (account_…). Defaults to the project's tenant (list_auth_tenants when it has several).","type":"string"},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"}},"required":["user"],"additionalProperties":false}},{"name":"send_password_setup","title":"Send a password setup email","description":"Send a user the email (or code) to set or reset their password — to invite a user created by hand, or to unblock one who forgot it.","product":"auth","access":"write","requires":"mode=write","input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"user":{"type":"string","description":"User id (user_…) or exact email"},"channel":{"type":"string","enum":["email","sms","whatsapp"]},"tenant":{"description":"Auth tenant id (account_…). Defaults to the project's tenant (list_auth_tenants when it has several).","type":"string"},"project":{"description":"Project id, name or slug. Defaults to the active project (`faable project use`).","type":"string"}},"required":["user"],"additionalProperties":false}}]}