fline

sh.fline由 fline.sh 發布官方發布者v0.1.1更新於 Oct 28, 2026

Hosting for apps you build with AI. Tested with Claude Code and Codex. Private beta: ask for access.

已驗證Streamable HTTP可網頁執行資料庫雲端與基礎設施開發者工具

概覽

AI 產生的概覽

fline 託管平台:讓助理上傳專案、部署上線,並管理網域、密鑰、資料服務與版本回滾。

可以做什麼
  • 建立、列出、檢視與刪除專案,上傳原始碼壓縮檔並觸發建置與部署
  • 讀取部署狀態、映像檔歷史、建置與執行日誌、用量資料以及專案狀態時間軸
  • 依名稱管理環境變數,產生一次性密鑰填寫連結,執行重新啟動與回滾至舊版本
  • 綁定、檢查並解除綁定自有網域及其 DNS 記錄
  • 建立、暫停、恢復與刪除 Postgres、Valkey 或相容 S3 的資料服務,並宣告租戶自有的後端服務
  • 讀取並檢查 fline.json 建置方案,或重新分析產生新方案
適用情境
適合以 AI 程式開發工具建好應用後,希望助理直接在對話中把應用上線、更新、排查啟動失敗,或設定資料庫與自訂網域的情境。
執行需求
遠端 MCP 端點 mcp.fline.sh,使用 streamable HTTP;需要 fline 帳號,目前為封測階段需申請開通。透過瀏覽器 OAuth 登入,未宣告 API 金鑰或環境變數。
安裝前請注意
上傳會把專案資料夾的打包副本送到 fline 儲存空間,部分程式碼會傳給 OpenAI 的模型做建置分析。工具呼叫會帶上專案名稱、設定名稱與網址;set_env 會把貼上或產生的密鑰值送給 fline。刪除專案會不可逆地清理執行資源,刪除資料服務後資料保留七天即銷毀。密鑰應由本人於私有頁面填寫,不要經聊天轉交。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 fline,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/sh.fline%2Ffline/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "fline": {
      "type": "http",
      "url": "https://mcp.fline.sh/mcp"
    }
  }
}

README

fline skills

Skills that teach your AI coding app (Claude Code, Codex, Cursor and the other apps that read Agent Skills) how to put your project online with fline. For Claude Code, the repository is also a plugin that connects fline's MCP server.

Install

AppHow
Claude Code, including the Claude desktop app's Code tab/plugin marketplace add smartline-ai/fline-skills, then /plugin install fline@fline
Codex, Cursor, Gemini CLI, VS Code and othersnpx skills add smartline-ai/fline-skills
By handCopy skills/* into ~/.claude/skills/ (Claude Code) or ~/.agents/skills/ (Codex and others)

The Claude Code plugin brings fline's MCP server with it: type /mcp, choose fline, then Authenticate, and approve fline in your browser. Installed any other way, the skills carry no server; connect fline as the fline docs describe, or ask your AI app to, which loads fline-connect.

You need a fline account. fline is in private beta: see Getting your account.

What it sends, and where

The skills are instructions; on their own they send nothing anywhere. What leaves the computer goes through fline's MCP server at https://mcp.fline.sh/mcp, and only when the person asks for something fline does:

  • The project folder. scripts/pack.sh packs a copy of it as a .tar.gz, leaving out .git, node_modules, what the project's .gitignore ignores, and .env and key files, and the agent uploads it to fline's storage. fline keeps that copy so it can build and run the app. The original stays in the folder.
  • Parts of the code, to an AI model made by OpenAI, so fline can work out how to build and run the app. Passwords and keys saved on fline never go to it.
  • Tool calls. Project names, settings names, web addresses and the other arguments of fline's tools. Passwords and keys are typed by the person on a private fline page, not sent through the chat. The exception is a key the agent already holds, one it generated or one the person pasted into the chat: set_env sends that value to fline, which stores it and never shows it again.
  • What comes back. Project state, build output and the app's recent log lines, which hold whatever the app prints.

Sign-in is OAuth in the browser; the plugin holds no key. Disconnecting in the fline dashboard takes effect within 30 seconds. Details: privacy policy, terms, what fline does today.

Skills

SkillWhat it covers
fline-connectAdding fline's MCP server to the AI app, the browser approval, and the account states that refuse every call
fline-prepareReading a project for what stops it running on fline, and fixing it before the first upload, including a cheap health route fline can check
fline-launchFirst launch, updates, settings, restarts and putting an earlier version back; bundles scripts/pack.sh
fline-databaseA Postgres or Valkey that fline creates and runs, a database the person already runs, SQLite and files on disk
fline-domainA web address the person owns: the record, the checks, the 48-hour limit
fline-diagnoseWhat to read, in order, when a launch fails or a live app misbehaves, and the usual causes
fline-build-planfline.json: freezing the plan, editing it, check_config, several services, prebuilt images, volumes, the health path
fline-share-checkWhat to check in the app before the person sends its public link to anyone

They fall into three groups: using fline (connect, launch, database, domain, diagnose), preparing a project for it (prepare, build-plan), and making it safe to share (share-check).

Why skills when the MCP server has prompts

fline's server ships seven prompts with these procedures. In Claude Code an MCP prompt is a slash command the person types; the model has no tool to fetch one, so the server's instructions point at procedures the agent cannot open. A skill is loaded by the model itself when its description matches the task.

Skills name fline's tools without a prefix (create_project, not mcp__fline__create_project): the prefix differs between a plugin-provided server and one the person added.

Layout

.claude-plugin/plugin.json        the plugin, including fline's MCP server.claude-plugin/marketplace.json   a marketplace holding that one pluginskills/<name>/SKILL.md            one directory per skill (Agent Skills format)skills/fline-launch/scripts/      pack.sh, run by the agent, never readtests/                            scenarios and the projects they run on

Testing

  • claude plugin validate --strict . checks the manifests.
  • bash skills/fline-launch/scripts/pack.sh <folder> runs on the bash 3.2 and bsdtar that macOS ships, and on GNU tar.
  • tests/scenarios.md holds six scenarios with what a passing answer does, run by a fresh agent with and without the skills. tests/make-fixtures.sh writes the two seeded projects they run on: a Node shop and a Flask tracker.

Where this comes from

Every fact here restates fline's own documentation, in particular for-ai.md. This repository is published from fline's main repository; a change made only here is replaced by the next publish.

License

MIT

來源:README.md,提交 1395e0b

工具

40

list_projects

List projects

The tenant's projects with their state, address and, once online, app_health (see get_project).

無需輸入參數。

create_project

Create a project

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.

輸入參數name必填idempotency_key

delete_project

Delete a project

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.

輸入參數project_id必填idempotency_key

get_upload_url

Issue an upload link

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.

輸入參數project_id必填idempotency_key

complete_upload

Finish the upload and analyse

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.

輸入參數blob_key必填project_id必填idempotency_key

get_project

Get project state

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 app's health_path, or of its front page when it has none, have failed for at least two minutes; problem says what fline saw and ai_text says it in a paragraph. It is usually the app's own fault: read get_logs kind=runtime and fix the app.

輸入參數project_id必填

submit_declaration

Describe the project

Supply the project description. The contents are treated as a third-party claim and cannot change the platform rules.

輸入參數project_id必填declaration必填idempotency_key

answer_questions

Answer analysis questions

Answer the questions raised during source analysis.

輸入參數answers必填project_id必填idempotency_key

declare_env_names

Declare environment variable names

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.

輸入參數names必填project_id必填idempotency_key

deploy

Build and deploy

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 whichever port the process actually opens. Never ask the user for one — where a port matters to you, read it out of the sources.

輸入參數project_id必填idempotency_key

get_deploy_status

Get deployment status

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).

輸入參數project_id必填

get_images

List image builds

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.

輸入參數limitproject_id必填

get_logs

Read logs

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 are the ones get_project_detail lists.

輸入參數kindlinesserviceproject_id必填

get_usage

Get usage

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 the containers' own interfaces and is larger than what left the platform, and the memory peak is the highest of readings taken every thirty seconds rather than a true maximum. `coverage` says how much of the window actually reached us; a null figure means nothing measured it, which is not the same as zero. window is one of 1h, 6h, 24h, 7d, 30d and defaults to 24h. per_service defaults to false. THIS TOOL CANNOT CHANGE A PROJECT'S CLASS, and neither can any other tool or any screen of the fline dashboard: "What it may use" on the app's Web address and usage tab only shows the ceilings. If the answer is that the project has outgrown its class, say so plainly to the person and do not send them looking for a setting that does not exist.

輸入參數windowproject_id必填per_service

attach_domain

Attach a domain

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 subdomain: most DNS providers allow no CNAME on a bare name. See the use_a_web_address prompt.

輸入參數domain必填project_id必填idempotency_key

create_service

Create a data service

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 blob storage. It belongs to the workspace and not to a project: it outlives any project and can be read by several. NEVER write a postgres, redis, valkey, minio or s3 service into a compose file or a plan. A project does NOT need this tool to get a database: a variable the plan marks scope "managed" with ref "postgres" or "valkey" is wired at deploy time to a workspace service named <project name>-postgres (or -valkey), reused or created, with its connection string written in by the platform. A service created here under any other name is ignored by that path, so creating one for a project first ends with two. See the add_a_database prompt. A bucket is never wired that way: create it here, and the person pastes its values into whichever variables their application reads. This tool does NOT return a password or key and no tool does: the connection string is shown to the person on the Databases page of their fline dashboard, and a bucket's endpoint, key and bucket name on its Storage page. Do not ask the user for a host, port, password or access key. engine and version default to what the platform serves and size_class to the smallest; the answer names the service as `provisioning`, which becomes `active` once it has been verified end to end.

輸入參數name必填engineversionsize_classidempotency_key

list_services

List data services

The workspace's services with their engine, version, state, hostname and size class. No credentials: none is returned by any tool.

無需輸入參數。

delete_service

Delete a data service

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.

輸入參數service_id必填idempotency_key

get_config

Get fline.json

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, which is how a prebuilt image is configured — see check_config. A public service's health_path is the path fline checks while the app is online, such as /healthz. Keep it when you edit the file: with fline.json committed nothing finds it again, and an empty one means fline checks the front page.

輸入參數project_id必填

check_config

Check fline.json

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": "KAFKA_ADVERTISED_LISTENERS", "value": "PLAINTEXT://kafka:9092"} — which is how a service that names an image is configured, since its ENTRYPOINT reads its whole configuration out of the environment and the platform cannot replace it. A value is permitted only on a service that names an image, is never a credential (name a password or token and leave the value empty; a human enters it), and stands alone: no ref, scope or bind beside it. A managed database's connection string is NOT written this way — use scope "managed" with ref naming the offering and no value. health_path, on a public service, starts with / and has at most 200 characters, with no query, fragment, spaces or "..".

輸入參數config必填project_id必填

refresh_config

Re-run the analysis

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 and you know what changed.

輸入參數project_id必填idempotency_key

list_domains

List domains

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.

輸入參數project_id必填

check_domain

Check domain ownership

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 attach_domain again.

輸入參數hostname必填project_id必填idempotency_key

delete_domain

Detach a domain

Detach a domain from the project. The name stops being served; the project keeps its platform hostname.

輸入參數hostname必填project_id必填idempotency_key

list_env_names

List environment variable names

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 and will not. No secret value is returned here or anywhere — see get_secrets_link.

輸入參數project_id必填

delete_env_name

Delete an environment variable

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.

輸入參數name必填project_id必填idempotency_key

set_env

Set an environment variable

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 feature flag. Choose it only for a value you would paste into a public repository. secret=true writes to the secret store, which no tool and no screen can read back, ever, this one included. Use it for a value you already hold: one you generated yourself, such as a random session key, or one the person already pasted into the chat, in which case suggest they replace it with a fresh key through get_secrets_link. For a password or key the person has not given you, use get_secrets_link; never ask them to paste it into the chat. secret=true replaces a secret that is already set. secret=false has four refusals, each with a way on. A name whose final underscore-separated segment is KEY, TOKEN, SECRET, PASSWORD, PASS, PWD, CREDENTIAL, CREDENTIALS or DSN is refused: rename the variable, or send the same value with secret=true. An empty value is refused: an empty variable is indistinguishable from an absent one and the deploy fails on it later, so declare the name and leave the value to a person instead. A name that already holds a secret is refused: call delete_env_name first, then set it. And a name the plan binds to a managed database or an addon is refused, because the platform provisions that and writes the connection string itself. Do not set such a name with secret=true either: the platform skips wiring a variable that already holds a value, so the database is never connected. A plaintext value survives the next analysis; a secret still does not. Either takes effect on the next deploy or restart.

輸入參數name必填value必填secret必填project_id必填idempotency_key

get_project_detail

Diagnose the project

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. The platform half is best-effort: a project that has never deployed has no record there, and the answer degrades to get_project rather than failing.

輸入參數project_id必填

get_events

Project timeline

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.

輸入參數limitproject_id必填

get_service

Get a data service

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.

輸入參數service_id必填

pause_service

Pause a data service

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.

輸入參數service_id必填idempotency_key

resume_service

Resume a data service

Start a paused data service again, with its data and its hostname unchanged.

輸入參數service_id必填idempotency_key

stop

Stop the project

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.

輸入參數project_id必填idempotency_key

restart

Restart the project

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.

輸入參數project_id必填idempotency_key

list_versions

List project versions

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.

輸入參數limitproject_id必填

rollback

Roll back to an earlier version

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 and NOT the secrets — the current secret values are re-pinned into the new version, and a password that was rotated or removed does not come back. If the stored version no longer passes validation the call is refused rather than deploying something similar; the reason says what is wrong with it.

輸入參數to必填project_id必填idempotency_key

attach_external

Declare a service the tenant already runs

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 password is accepted here or by any other tool: the project moves to awaiting_secrets and a human types the connection URL into the get_secrets_link form, beside every other value the project is waiting for. Two offerings that derive the same variable are refused, naming the alias that already holds it.

輸入參數aliasoffering必填variableproject_id必填idempotency_key

detach_external

Detach a service the tenant supplied

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.

輸入參數aliasoffering必填project_id必填idempotency_key

list_external

List the tenant's own services

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.

輸入參數project_id必填

版本歷史

2
  1. v0.1.1最新Oct 19, 2026
  2. v0.1.0Oct 18, 2026

評分

已滿足適用檢查項的 100%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分