@shahidkhan_23232/fcp-cli
v0.1.5
Published
Operate a hosted FCP scheduling platform from a terminal or an agent
Readme
The fcp CLI
fcp drives one hosted FCP workspace from a terminal. You install it, sign in
against a URL, and then either run commands yourself or point Claude at it and
let Claude operate the product for you.
Every command follows the same rules, so an agent can use it without guessing:
--jsonon any command prints the raw API result.- A failure prints one line on stderr and exits non-zero.
- Writes go through the same handlers the browser uses, so rules, hooks and the audit trail apply.
Install
Today the CLI runs from the repository under tsx, like the other apps:
pnpm install
node --import tsx apps/cli/src/bin.ts <command>Give yourself a short alias:
alias fcp='node --import tsx /path/to/fcp-platform/apps/cli/src/bin.ts'After pnpm --filter @fcp/cli-app build the same CLI runs from
apps/cli/dist/bin.js, which is what the published fcp binary points at.
Sign in
fcp login https://fcp.example.com --email [email protected] --password '…'
fcp whoami
fcp logoutlogin signs in against the host's Better Auth endpoint and stores the session
token in your config directory with owner-only permissions:
| Platform | File |
| -------- | ----------------------------------------------- |
| Windows | %APPDATA%\fcp\session.json |
| macOS | ~/Library/Application Support/fcp/session.json |
| Linux | $XDG_CONFIG_HOME/fcp/session.json |
The token is never printed and never written inside the repository.
| Variable | What it does |
| -------------- | ---------------------------------------------------------------- |
| FCP_PASSWORD | Supplies the password instead of --password |
| FCP_URL, FCP_TOKEN | Use this host and token instead of the stored session |
| FCP_ORIGIN | Origin header sent to the host; defaults to the host URL |
| FCP_CONFIG_DIR | Where the session file lives |
Two-factor accounts add --otp <code>.
FCP_ORIGIN matters when the API and the web app sit on different origins, as
they do in local development: the API trusts http://localhost:5173, not
http://localhost:3000, so a local login needs
FCP_ORIGIN=http://localhost:5173. A hosted FCP serves both from one origin and
needs nothing.
Commands
| Command | What it does |
| ------- | ------------ |
| fcp login <url> --email … [--password …] [--otp …] | Sign in and store the session |
| fcp logout | Remove the stored session |
| fcp whoami | Print the host and the signed-in account |
| fcp entity list <entity> [--filter …] [--sort …] [--limit n] [--offset n] | Read rows |
| fcp entity get <entity> <id> | Read one row |
| fcp entity create <entity> --data '<json>' \| --file <path> | Create a row |
| fcp entity update <entity> --data '<json>' | Update a row |
| fcp entity delete <entity> --data '{"id":…}' | Delete a row |
| fcp extension init <folder> --kind … --id … --name … | Scaffold an extension |
| fcp extension validate <folder> | Check the manifest and compile the sources |
| fcp extension build <folder> <output> | Write the artifacts and extension.json |
| fcp extension install <folder> [--approve] [--update] [--scopes a,b] | Build and install |
| fcp extension approve <id> --scopes a,b | Approve pending scopes |
| fcp extension enable\|disable\|uninstall <id> | Lifecycle |
| fcp extension list | List installed extensions |
| fcp extension dev <folder> [--approve] | Watch, rebuild and push on every save |
| fcp propose --lever '<json>' [--note …] | Stage a scheduling change |
| fcp accept <id> / fcp reject <id> | Decide a staged proposal |
| fcp events [--entity …] [--state …] [--limit n] [--follow] | Read the entity event queue |
| fcp schedule | Read the current plan |
| fcp kpis | Read the current KPI set |
| fcp mcp | Serve the FCP tools over stdio for an agent |
| fcp skills get core | Print the skill this CLI ships |
Entities
--filter repeats and reads field:op:value, with the operators eq ne lt lte
gt gte contains in isNull isNotNull. The value is read as JSON when it parses
as JSON, so isActive:eq:true is a boolean. --sort repeats and reads
field:asc or field:desc.
create and update take the whole row as one JSON object. The workspace
revision is fetched and supplied for you; put expectedRevision inside
--data when you want the write to fail on a concurrent change. Copy the field
set from an existing row:
fcp entity list customers --limit 1 --jsonExtensions
install reads the folder, compiles panels, views and slots, attaches hook
handler sources as artifacts, and posts the bundle. Without --approve the
install lands disabled with pending scopes, which a person approves in the
Extensions screen or with fcp extension approve.
dev pushes an update after every save so the running app hot-swaps the
module. It prints one line per push and keeps going after a failed build.
init copies from skills/fcp-extension-author/templates. It finds that folder
by walking up from the CLI; set FCP_TEMPLATE_DIR when the CLI lives elsewhere.
Connecting Claude
claude mcp add fcp -- fcp mcpfcp mcp serves twelve tools over stdio against the host you are signed in to:
list_entities, get_entity, create_entity, update_entity,
delete_entity, list_entity_events, create_job, edit_job, propose,
decide_proposal, install_extension and set_extension_field. It is the
whole product surface an agent needs: read data, change data, install an
extension, stage a scheduling change for a person to accept.
Point Claude at the shipped skill first:
fcp skills get core