SDKs & MCP
SDKs and MCP
Eight official language SDKs (Node, Python, Go, Rust, Ruby, PHP, Swift, Kotlin) plus an MCP server for AI agents — install paths, package manager links, and quickstart snippets per stack.
Last updated:
FloopFloop SDKs & MCP
FloopFloop ships eight official language SDKs plus an MCP server for AI agents. Every surface targets the same /api/v1/* backend — so a project created via the Node SDK is the same project an LLM running through the MCP will see, byte-for-byte.
Pick the right surface for your stack:
- Building an app or backend? Use the SDK for your language.
- Building an AI agent / chatbot? Use the
@floopfloop/mcpserver with Claude Desktop, Cursor, Zed, Copilot CLI, or any MCP-aware host. - Driving from the terminal? Use the FloopFloop CLI.
MCP server — for AI agents
@floopfloop/mcp— Model Context Protocol server. Wraps the FloopFloop API as 23 tools that any MCP-aware LLM host can call.
Tools cover the full project lifecycle: create_project, refine_project, upload_from_path(attachments), cancel_project, reactivate_project, wait_for_live, list_secrets / set_secret / remove_secret, list_library_projects / clone_library_project, current_subscription, usage_summary, plus subdomain checks and API-key management. Each tool is read-only or marked destructiveHint so the host can prompt the user before mutating state.
Claude Desktop config snippet
{
"mcpServers": {
"floopfloop": {
"command": "npx",
"args": ["-y", "@floopfloop/mcp"],
"env": { "FLOOP_API_KEY": "flp_..." }
}
}
}Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json(Windows), restart Claude Desktop, and ask “build me a FloopFloop site for <X>”.
Pair with floop-skills for the playbook
The MCP exposes the capabilities; floop-skills ships drop-in Anthropic-style markdown skills that explain the workflows — when to call which tool, in what order, with which args. Install both for the best agent experience:
mkdir -p ~/.claude/skills
git clone https://github.com/FloopFloopAI/floop-skills.git /tmp/floop-skills
cp -r /tmp/floop-skills/skills/* ~/.claude/skills/Links: npm · GitHub · floop-skills
Language SDKs
Same surface across all eight: client.projects.create(), refine, waitForLive / streaming, secrets, uploads, library, apiKeys, subscriptions.current, usage.summary, subdomains, user.me. Each SDK ships per its language's native idiom (sync + async on Python, Flow on Kotlin, AsyncThrowingStream on Swift, etc.) but the wire contract — error codes, response envelopes, terminal-state semantics — is identical.
Node / TypeScript — @floopfloop/sdk
Node 20+. Native fetch, full TypeScript types,AsyncIterator for streaming. The canonical SDK; the MCP server wraps this one directly.
npm install @floopfloop/sdk
import { FloopClient } from "@floopfloop/sdk";
const floop = new FloopClient({ apiKey: process.env.FLOOP_API_KEY! });
const { project } = await floop.projects.create({
prompt: "a cat-cafe blog with three sample posts",
});
const live = await floop.projects.waitForLive(project.id);
console.log(live.url);Links: npm · GitHub · cookbook
Python — floopfloop
Python 3.10+. Sync FloopClient on httpx.Client plus async AsyncFloopClient on httpx.AsyncClient — same nine resource accessors, async for on projects.stream.
pip install floopfloop
from floopfloop import FloopClient
floop = FloopClient(api_key=os.environ["FLOOP_API_KEY"])
created = floop.projects.create(prompt="a cat cafe landing page")
live = floop.projects.wait_for_live(created["project"]["id"])
print(live["url"])Links: PyPI · GitHub · cookbook
Go — github.com/FloopFloopAI/floop-go-sdk
Go 1.22+. Idiomatic context.Context first arg, *Error with typed code field, channels-friendly streaming.
go get github.com/FloopFloopAI/floop-go-sdk@latest
client := floop.NewClient(os.Getenv("FLOOP_API_KEY"))
res, err := client.Projects.Create(ctx, floop.CreateProjectInput{
Prompt: "a cat cafe landing page",
})
if err != nil { log.Fatal(err) }
live, err := client.Projects.WaitForLive(ctx, res.Project.ID, nil)
fmt.Println(live.URL)Links: pkg.go.dev · GitHub · cookbook
Rust — floopfloop
Rust 2021 / 1.75+. tokio-based async, builder pattern on the client, typed FloopErrorCode enum, Result<T, FloopError> on every method.
# Cargo.toml
floopfloop = "0.1.0-alpha.4"
use floopfloop::{Client, CreateProjectInput};
let client = Client::new(std::env::var("FLOOP_API_KEY")?)?;
let res = client.projects().create(CreateProjectInput {
prompt: "a cat cafe landing page".into(),
..Default::default()
}).await?;
let live = client.projects().wait_for_live(&res.project.id, None).await?;
println!("{}", live.url.unwrap_or_default());Links: crates.io · docs.rs · GitHub · cookbook
Ruby — floopfloop
Ruby 3.0+. Net::HTTP transport, hash-based responses (no opinionated typed wrappers), block-passing for streaming.
gem install floopfloop
require "floopfloop"
client = FloopFloop::Client.new(api_key: ENV.fetch("FLOOP_API_KEY"))
res = client.projects.create(prompt: "a cat cafe landing page")
live = client.projects.wait_for_live(res["project"]["id"])
puts live["url"]Links: RubyGems · GitHub · cookbook
PHP — floopfloop/sdk
PHP 8.1+. Pure stdlib transport (no ext-curl needed), named-argument-friendly constructor, FloopFloop\Error exception class with typed code.
composer require floopfloop/sdk
$client = new FloopFloop\Client(apiKey: getenv('FLOOP_API_KEY'));
$res = $client->projects()->create(prompt: 'a cat cafe landing page');
$live = $client->projects()->waitForLive($res['project']['id']);
echo $live['url'];Links: Packagist · GitHub · cookbook
Swift — FloopFloop (SPM)
Swift 5.9+. async/await throughout, Codable types, AsyncThrowingStream for streaming. iOS 17+ / macOS 14+ / tvOS 17+ / watchOS 10+ / visionOS 1+. Server-side / desktop today; mobile-app distribution needs a different auth flow on the backend (roadmap).
// Package.swift
.package(url: "https://github.com/FloopFloopAI/floop-swift-sdk.git", from: "0.1.0-alpha.2")
import FloopFloop
let client = FloopFloop(apiKey: ProcessInfo.processInfo.environment["FLOOP_API_KEY"]!)
let res = try await client.projects.create(.init(prompt: "a cat cafe landing page"))
let live = try await client.projects.waitForLive(res.project.id)
print(live.url ?? "")Links: SPM tags · GitHub · cookbook
Kotlin / JVM — floop-kotlin-sdk
Kotlin 2.0+ / JVM 11+. OkHttp + kotlinx-serialization + kotlinx-coroutines. suspend functions throughout; streaming via cold Flow<StatusEvent>. JitPack distribution (Maven Central planned).
// build.gradle.kts
repositories {
maven("https://jitpack.io")
}
dependencies {
implementation("com.github.FloopFloopAI:floop-kotlin-sdk:0.1.0-alpha.3")
}
import com.floopfloop.sdk.FloopFloop
import com.floopfloop.sdk.resources.CreateProjectInput
val client = FloopFloop(apiKey = System.getenv("FLOOP_API_KEY"))
val res = client.projects.create(CreateProjectInput(prompt = "a cat cafe landing page"))
val live = client.projects.waitForLive(res.project.id)
println(live.url)API keys
Every SDK uses programmatic flp_… API keys for authentication, distinct from the device tokens the CLI uses for interactive logins. API-key issuance requires the Business plan. Mint a key from Account → API Keys, store it in your secret manager / environment, and pass it to the SDK constructor.
See API Authentication for the full key model (scopes, rate limits, rotation pattern).
Source & releases
All eight SDK repos plus the MCP and skills are open-source under the MIT license at github.com/FloopFloopAI. Each release ships to its language's standard registry on tag push (npm, PyPI, crates.io, RubyGems, Packagist, Go modules, JitPack, SPM tags). Per-SDK CHANGELOGs in each repo; cross-SDK release coordination tracked in the monorepo.