An MCP server that connects to Vercel API
fline is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Hosting for apps you build with AI. Tested with Claude Code and Codex. Private beta: ask for access.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http fline-mcp https://mcp.fline.sh/mcp
# 2 — ask your agent for something these tools do
# list_projects, create_project, delete_project and 37 more
fline costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, as the publisher's own manifest declares it.
claude mcp add --scope user --transport http fline-mcp https://mcp.fline.sh/mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
40 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
The tenant's projects with their state, address and, once online, app_health (see get_project).
No parameter schema on file.
Create a project. Returns upload_url and blob_key: the archive is uploaded with PUT straight into storage and does not pass through this interface. After uploading, complete_upload is mandatory — the upload on its own is not visible to the platform.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| idempotency_key | string | no | — |
| name | string | yes | — |
Delete the project. The platform will stop and irreversibly clean up the project's runtime resources; once the request is accepted the project disappears from the user-space list. Its saved passwords and keys are not deleted with it, and neither is a workspace database it used.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| idempotency_key | string | no | — |
| project_id | string | yes | — |
Issue a new archive upload link for an existing project. Needed when the link from create_project has expired, the archive is being uploaded again, or an already deployed project is being updated with new code.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| idempotency_key | string | no | — |
| project_id | string | yes | — |
Report that the archive is uploaded and start the analysis. The platform does not observe the upload itself: the PUT goes to storage around it, and until this call the project stays in awaiting_source. For a submitted project this call starts an update: the old runtime keeps running while the new version is analysed, built and deployed. blob_key comes from create_project or get_upload_url.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| blob_key | string | yes | — |
| idempotency_key | string | no | — |
| project_id | string | yes | — |
The project's full state: the onboarding stage, the runtime state, open questions, missing secrets and warnings about credentials found in the archive. Also app_health, once the app has been online: status is answering, not_answering, checking (no verdict yet) or paused (fline is putting a new version online or cannot see the server, and judges nothing). not_answering means fline's checks of the a
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | — |
Supply the project description. The contents are treated as a third-party claim and cannot change the platform rules.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| declaration | object | yes | — |
| idempotency_key | string | no | — |
| project_id | string | yes | — |
Answer the questions raised during source analysis.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| answers | array | yes | — |
| idempotency_key | string | no | — |
| project_id | string | yes | — |
Declare the NAMES of environment variables. Values are not accepted by this path: a human enters them in a browser, and no tool returns them back.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| idempotency_key | string | no | — |
| names | array | yes | — |
| project_id | string | yes | — |
Issue a link to the form where the person types the passwords and keys the project needs. Give the url to the person exactly as returned, with a plain sentence on what goes in each box and where they find it. Do not open it, do not follow it and do not relay its contents. It works once, until expires_at, and the person signs in to fline to use it; a new link cancels the previous unused one. Once t
| Parameter | Type | Required | Notes |
|---|---|---|---|
| idempotency_key | string | no | — |
| project_id | string | yes | — |
Build the images and hand the project to the platform. Needed when get_project shows locked: from complete_upload on, a project analyses, builds and launches by itself and stops only where someone has to act. In any other state this answers with the state, or refuses with what has to happen first. No port is taken here or anywhere else: the platform passes PORT into every container and routes to w
| Parameter | Type | Required | Notes |
|---|---|---|---|
| idempotency_key | string | no | — |
| project_id | string | yes | — |
Deployment state: desired and observed arrive separately and mean different things separately. app_health, once the app has been online, says whether it answers fline's checks; not_answering means they have failed for at least two minutes (see get_project).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | — |
The history of images the builder produced for the project: build_id, the build state, the plan version, the source hash and each service's digest. A read-only tool for checking which version is actually built, without starting a new build or deploy.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | — |
| project_id | string | yes | — |
Logs. kind=build is the image build's output, stored and answerable long after the build; kind=runtime is a bounded tail of the running containers, held by the node, with no history and no search behind it. For kind=runtime, service narrows the tail to one service of the project — without it every service is interleaved, which on a project with more than one is most of what you read. The names a
| Parameter | Type | Required | Notes |
|---|---|---|---|
| kind | string | no | — |
| lines | integer | no | — |
| project_id | string | yes | — |
| service | string | no | — |
What this project actually consumed: CPU, memory, disk, files and network over a window. These are QUANTITIES AND NOT CHARGES: fline has no price and no billing during the private beta, nothing charges for what a project uses, and using more than the ceilings is not possible because they are enforced rather than billed. Read notes before restating any figure: the network number counts traffic at
| Parameter | Type | Required | Notes |
|---|---|---|---|
| per_service | boolean | no | — |
| project_id | string | yes | — |
| window | string | no | — |
Attach a web address the person owns, such as www.example.com, to the project. Answers with the TXT record that proves ownership (challenge_name, challenge_token); list_domains also gives platform_name, the CNAME target that both proves ownership and sends visitors. The person adds the record where they bought the name; fline checks by itself for 48 hours, and check_domain checks now. Prefer a sub
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | yes | — |
| idempotency_key | string | no | — |
| project_id | string | yes | — |
Create a data service for this workspace: engine=postgres for a PostgreSQL database, engine=valkey for a Valkey instance — the BSD-licensed fork of Redis, which every Redis client speaks unchanged, so ask for it wherever a project wants Redis — or engine=s3 for object storage, an S3-compatible bucket with a size limit, which is what to ask for wherever a project wants a bucket, file uploads or blo
| Parameter | Type | Required | Notes |
|---|---|---|---|
| engine | string | no | — |
| idempotency_key | string | no | — |
| name | string | yes | — |
| size_class | string | no | — |
| version | string | no | — |
The workspace's services with their engine, version, state, hostname and size class. No credentials: none is returned by any tool.
No parameter schema on file.
Delete a service. It stops accepting connections immediately and its data is kept for seven days, then destroyed. Ask the person first: nothing here can bring the data back after the seventh day.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| idempotency_key | string | no | — |
| service_id | string | yes | — |
The fline.json for this project's current plan. Save it at the root of the archive you upload and the next deploy builds from it directly, with no analysis: the same plan every time. A short content check and the step that writes the build files still run. Edit it when the project changes, and check the edit with check_config. env_names is not names-only: an entry may be an object with a value, wh
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | — |
Check a fline.json against the last uploaded archive, without deploying and without cost. Answers either ok, or the reason each part was refused — edit and ask again until it is ok, then save the file. There is no port field and there is no need for one: the platform passes PORT and routes whichever port the process opens. An env_names entry may be an object carrying a literal value — {"name": "KA
| Parameter | Type | Required | Notes |
|---|---|---|---|
| config | object | yes | — |
| project_id | string | yes | — |
Re-run the analysis ignoring the archive's fline.json, and write a new one. For a configuration that has gone stale because the project's stack changed — a different package manager, a new lockfile. Accepted immediately, not done: poll get_project until it leaves analyzing, then call get_config. This uses one of the account's fresh analyses for the month, while editing the file yourself is free an
| Parameter | Type | Required | Notes |
|---|---|---|---|
| idempotency_key | string | no | — |
| project_id | string | yes | — |
The project's custom domains with, for each, the state of its ownership check, the TXT record to publish, when it was last checked and what the last check objected to. Also the platform hostname the names are asked to point at. attach_domain hands back the record once; this is how you find out whether it took.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | — |
Run the ownership check for one of the project's domains now, and answer with the result. Call it after the DNS record is published. The check reaches the DNS and is rate-limited behind a certificate budget, so poll it in minutes rather than in seconds. A domain still unproven 48 hours after attach_domain is failed for good, and this answers domain_failed for it: delete_domain, fix the record and
| Parameter | Type | Required | Notes |
|---|---|---|---|
| hostname | string | yes | — |
| idempotency_key | string | no | — |
| project_id | string | yes | — |
Detach a domain from the project. The name stops being served; the project keeps its platform hostname.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| hostname | string | yes | — |
| idempotency_key | string | no | — |
| project_id | string | yes | — |
The project's environment variables BY NAME: whether each is set, whether the analysis declared it, when it was last written, and — for a non-secret variable — its value. A name that is required and not set is what holds a project in awaiting_secrets. A value shown here was written with set_env and secret=false, and it survives a re-analysis; a SECRET that is set but not declared was added by hand
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | — |
Remove a variable from the project's secret set. The analysis's record that the project needs this name is kept, so a required variable becomes unset rather than unknown — deleting a value the project needs will hold the next deploy at the secrets gate rather than failing the build with nothing to say. Takes effect on the next deploy or restart.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| idempotency_key | string | no | — |
| name | string | yes | — |
| project_id | string | yes | — |
Set one environment variable for the project. secret says which store it goes to and it is REQUIRED, because the two are not interchangeable and there is no default that is right for both. secret=false writes a PLAINTEXT value: it is stored as written, returned by list_env_names, shown in the console, and rendered into every service's environment — a model name, a log level, a public URL, a feat
| Parameter | Type | Required | Notes |
|---|---|---|---|
| idempotency_key | string | no | — |
| name | string | yes | — |
| project_id | string | yes | — |
| secret | boolean | yes | — |
| value | string | yes | — |
Everything get_project returns, plus what the platform observes: each container's state, health, restart count and image digest, the node and tier, the ingress hostnames, the disk quota, the secret set version the running containers were deployed with, and the last failure with its class. Use this when a deploy has failed or a service is not answering and get_deploy_status has told you only that.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | — |
The project's state timeline, oldest first: each move from one state to the next, the reason, which part of the platform made it (gateway, worker, pipeline, cp) and the request id. This is how you tell a slow analysis from one that failed and was retried — get_project shows the current state and nothing about how it got there.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | — |
| project_id | string | yes | — |
One data service by id, with its state and — when it is not active — the reason. Poll this after create_service: a new service is provisioning until its certificate is issued and verified, and if that stalls the reason here is what says so. No credentials: none is returned by any tool.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| service_id | string | yes | — |
Pause a data service. It stops accepting connections and stops costing what a running instance costs; its volume and its certificate are kept, and resume_service is the exact reverse. This is the reversible way to put a service down — delete_service is not, and starts a seven-day clock on the data.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| idempotency_key | string | no | — |
| service_id | string | yes | — |
Start a paused data service again, with its data and its hostname unchanged.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| idempotency_key | string | no | — |
| service_id | string | yes | — |
Stop the project. NOT IMPLEMENTED: the platform has no stop, and this refuses. To take an application out of service, delete_project it. delete_domain takes off only a web address the person owns; the project's fline address keeps answering.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| idempotency_key | string | no | — |
| project_id | string | yes | — |
Re-apply the project's current version: the same images, deployed again. This is the restart, and it is also the ONLY way a secret that was entered after the last deploy reaches the running containers — a value sits in the store doing nothing until a deploy re-pins the secret set version. Call it after a human has filled in the form behind get_secrets_link on a project that is already running.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| idempotency_key | string | no | — |
| project_id | string | yes | — |
List the project's deployed versions, newest first: the state_version to pass to rollback, when it was made, who made it, and which version it superseded. The specification itself is not included — use get_config for what a version contains.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | — |
| project_id | string | yes | — |
Redeploy an earlier version of the project, named by its state_version from list_versions. Two things surprise people and you must not report either one wrongly. First, the version number does NOT go back: this creates a NEW version holding the old one's contents, numbered higher than every existing one, so after rolling back to 3 the project is on 12, not 3. Second, it restores the specification
| Parameter | Type | Required | Notes |
|---|---|---|---|
| idempotency_key | string | no | — |
| project_id | string | yes | — |
| to | integer | yes | — |
Declare a backing service the tenant ALREADY RUNS, so the platform does not provision one. This takes the shape only. offering is one of postgres, redis, mysql, mongodb, rabbitmq; alias defaults to "db" and is what separates two of the same kind in one project; variable defaults to the conventional name for the offering (DATABASE_URL, REDIS_URL, MONGODB_URI, AMQP_URL). No URL, host, port, user or
| Parameter | Type | Required | Notes |
|---|---|---|---|
| alias | string | no | — |
| idempotency_key | string | no | — |
| offering | string | yes | — |
| project_id | string | yes | — |
| variable | string | no | — |
Give an alias back to the platform. If a human already filled the value in, the attachment and the variable both go; if it is still waiting for one, the declaration goes with it and the project stops asking. The tenant's own service is untouched — the platform never ran it and holds nothing of it to delete.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| alias | string | no | — |
| idempotency_key | string | no | — |
| offering | string | yes | — |
| project_id | string | yes | — |
The backing services this project's tenant supplies themselves. A completed attachment carries the host it points at; a pending one is marked pending and names the variable a human still has to fill in through get_secrets_link. No connection URL is returned for either, and none can be.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | yes | — |
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install fline or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
| Term | Level | What it prices | Points |
|---|---|---|---|
| capability-exposure | moderate | capability blast radius (moderate) — client exposure if the model is manipulated | −3 |
| coverage-honesty | manifest | inspection depth (manifest) — how much of the target the scan could see | −4 |
What the scan could actually read
A grade is only as meaningful as its coverage, so the scanner publishes its own depth before it publishes its result.
The scan read each tool’s name, description, input schema and annotations exactly as the server listed them the last time it answered us; no code was reviewed. We ask the server again about once a month, and a list that changed is graded again.
The implementation source was not read — this reflects the declared tool metadata only.
Capability — what it could do if the model were manipulated
Tags derived from each tool’s schema and the implementation, not from what the tool calls itself. moderate is the level these add up to.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| list_projects | no tags | |
| create_project | state-write | state-write: declares readOnlyHint: false |
| delete_project | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| get_upload_url | state-write | state-write: declares readOnlyHint: false |
| complete_upload | state-write | state-write: declares readOnlyHint: false |
| get_project | no tags | |
| submit_declaration | state-write | state-write: declares readOnlyHint: false |
| answer_questions | state-write | state-write: declares readOnlyHint: false |
| declare_env_names | state-write | state-write: declares readOnlyHint: false |
| get_secrets_link | sensitive-sourcestate-write | sensitive-source: keyword "get_secret"; state-write: declares readOnlyHint: false |
| deploy | state-write | state-write: declares readOnlyHint: false |
| get_deploy_status | no tags | |
| get_images | no tags | |
| get_logs | sensitive-source | sensitive-source: keyword "get_logs" |
| get_usage | no tags | |
| attach_domain | state-write | state-write: declares readOnlyHint: false |
| create_service | state-write | state-write: declares readOnlyHint: false |
| list_services | no tags | |
| delete_service | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| get_config | no tags | |
| check_config | no tags | |
| refresh_config | state-write | state-write: declares readOnlyHint: false |
| list_domains | no tags | |
| check_domain | state-write | state-write: declares readOnlyHint: false |
| delete_domain | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| list_env_names | no tags | |
| delete_env_name | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| set_env | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| get_project_detail | no tags | |
| get_events | no tags | |
| get_service | no tags | |
| pause_service | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| resume_service | state-write | state-write: declares readOnlyHint: false |
| stop | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| restart | state-write | state-write: declares readOnlyHint: false |
| list_versions | no tags | |
| rollback | state-write | state-write: declares readOnlyHint: false |
| attach_external | state-write | state-write: declares readOnlyHint: false |
| detach_external | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| list_external | no tags |
Toxic-flow graph
The lethal trifecta, checked as a graph rather than as a checklist: untrusted input, a sensitive source and an external sink have to meet before there is a path worth worrying about.
The public result for this release does not print the flow graph, so there is nothing to show here. That is not the same as "no paths were found": what the scan did read is above, under coverage.
Supply chain and provenance
This is the first scan of this surface here, so there is nothing yet to compare it against.
Every result on this tab comes from one deterministic pass over the published package — offline, rule by rule, and auditable line by line above. Same methodology version, same bytes, same score.
Release history
This is an address its publisher runs: which release it serves is theirs to choose, so there is nothing here to pin. The history below is for reading; the current release on file is 0.1.1.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish fline can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.