Skip to content
v1.8 · The agent context optimization layer

Your AI agent reads 200 fields. It only needs 8.

Plynf sits between your AI agents and your business tools — Salesforce, Slack, Jira, Drive, internal databases — and cuts every tool response down to what the agent actually needs. Agents that stay focused. Same answers, provably. 40–80% fewer tokens on bloated tool responses.

install · macOS · linux
$ curl -fsSL https://raw.githubusercontent.com/nico-schindlbeck-jpg/plynf/main/install/install.sh | sh
Installs to ~/.plinth, no sudo · macOS & Linux · 5–8 min cold install
71% fewer tokens · 2,867 tests · 5 SDKs · Apache 2.0

Integrations & ecosystem

Anthropic MCP
OpenAI Compatible
GitHub OAuth
Slack OAuth
Linear OAuth
Notion OAuth
Google Workspace

The problem

APIs answer with everything they have. Plynf forwards what the agent needs.

Without Plynf

Noisy context. Diluted focus. Zero control.

  • Agents lose focus in the noise

    A Salesforce lead has 50–200 fields. Your agent needs 8. The other 190 dilute attention, invite hallucinated detail, and blow the context window on long tasks.

  • You pay for fields nobody reads

    Audit columns, sync tokens, null custom fields — serialized into every single call. On tool-heavy agents that's 40–80% of the tool-response tokens, every step, forever.

  • No control over what crosses the line

    Whatever the API returns is what the model provider sees. PII, internal notes, fraud scores — shipped wholesale, with no record of what crossed.

With Plynf

Focused agents. Same answers. You draw the line.

  • The model sees only what matters

    Keep-lists you control — casing- and schema-robust — cut each tool response to the fields the agent actually needs. Focused context, sharper answers.

  • Provably the same answers

    A lossless layer (nulls, empties, metadata) can't change the answer by construction. The open-source verification harness replays raw vs. shaped through your model and diffs the answers — measured, not asserted.

  • Deterministic, auditable, never blanks

    Pure transform — no second model in the path. Schema mismatch? It falls back safely instead of erasing data. PII can be masked or hashed before it ever leaves.

Try it now — no signup, no install

Paste a tool response. Watch it shrink.

This is the actual shaping mechanism, running in your browser — same logic, same GPT-4o tokenizer the proxy bills against. Nothing leaves this page, so go ahead and paste a real response from your API, CRM, or MCP server.

Raw tool response (JSON)
Fields that matter (optional keep-list — comma-separated, dotted paths ok)

No keep-list? You still get the lossless layer — null/empty fields and audit metadata removed. That can never change the model's answer. Field matching is casing-robust: order_id finds orderId, OrderID, …

Paste JSON on the left — or load a sample —
and the saving appears here instantly.

Customer-Support Agent · Salesforce + Order-DB

Same question. Same answer. 96 % fewer tokens.

The agent is asked "What's the status of order #12345?". It calls get_order. The order database returns 150 fields of payment metadata, warehouse pickers, audit trails, internal flags. Plynf strips it down to the 8 fields the agent actually needs — before the LLM ever sees the response.

Without Plynf

150 fields. 2,161 tokens.

{
  "order_id": "12345",
  "customer_id": "C-0001102",
  "customer_name": "Jane Doe",
  "customer_email": "jane.doe@example.com",
  "customer_phone": "+49 30 1234567",
  "customer_tier": "gold",
  "customer_lifetime_value": 12480.5,
  "status": "in_transit",
  "fulfillment_status": "shipped",
  "payment_status": "paid",
  "refund_status": "none",
  "carrier": "DHL",
  "tracking_number": "DHL-99887766554433",
  "estimated_delivery": "2026-05-28",
  "last_status_update": "2026-05-27T14:32:00Z",
  "warehouse_id": "WH-DE-01",
  "warehouse_zone": "B-04",
  "warehouse_bin": "B-04-117",
  "picker_id": "EMP-2218",
  "packer_id": "EMP-1097",
  "payment_provider_charge_id": "ch_3OabcXYZ123",
  "payment_provider_fee": 9.62,
  "card_brand": "visa",
  "card_last4": "4242",
  "risk_score": 0.04,
  "fraud_review_status": "passed",
  "items_summary": "3 items, $284.00 total",
  "items": [
    "… 3 line items, 18 fields each …"
  ],
  "audit_log": [
    "… 5 entries …"
  ],
  "history": [
    "… 8 events …"
  ],
  "created_at": "2026-05-25T19:24:00Z",
  "updated_at": "2026-05-27T14:32:00Z",
  "_internal_trace_id": "trace-7f1a-9b2c-d4e5",
  "_internal_correlation_id": "corr-5c6d-7e8f",
  "// …": "… and ~120 more fields"
}
tokens
2,161
$/call
$0.0108
fields
150+

With Plynf

8 fields. 83 tokens.

{
  "order_id": "12345",
  "customer_name": "Jane Doe",
  "status": "in_transit",
  "tracking_number": "DHL-99887766554433",
  "estimated_delivery": "2026-05-28",
  "carrier": "DHL",
  "items_summary": "3 items, $284.00 total",
  "last_status_update": "2026-05-27T14:32:00Z",
  "total_amount": 333.95
}
tokens
83
$/call
$0.0004
saved
96.2%
Projection At 1,000 support tickets per day, this single connector saves $312 / month on gpt-4o — and keeps 122 sensitive fields inside the source system. Numbers from examples/customer-support/run_demo.py · tiktoken (o200k_base) · gpt-4o input price $5/1M.

Six ways in. One engine.

Plynf is not bound to one agent framework. Pick the integration that fits your stack.

The optimization layer underneath is identical — same policies, same caching, same audit log — whether you wire Plynf in as a drop-in LLM proxy (nine native dialects — OpenAI, Anthropic, Gemini, Bedrock, Ollama, Cohere and more — routing across any provider), an MCP server, a native SDK in five languages, a no-code node, a chat bot, or a webhook endpoint.

Browse every install path, ranked by effort

Drop-in LLM Proxy

OpenAI · Anthropic · Gemini · Azure · Ollama · vLLM

1 min

Change `base_url`. Keep your client code. One front-door speaks all three API dialects.

client = OpenAI(
  api_key="sk-…",
  base_url="https://app.plynf.com/v1"
)

MCP Server

Anthropic Claude API · MCP-native clients

2 min

Register Plynf as an MCP server in your client config.

mcp_servers=[{
  "url": "https://app.plynf.com/mcp/salesforce"
}]

Native SDK · 5 languages

Python · TypeScript · Go · Swift · Kotlin

5 min

Wrap your existing tools — LangChain, LlamaIndex, CrewAI, AutoGen.

from plynf.langchain import wrap_tools
tools = wrap_tools([sf_tool, slack_tool])

No-Code Node

n8n · Zapier · Make.com · Copilot Studio

3 min

Install the Plynf node from the marketplace. Drag-and-drop.

// n8n workflow → Plynf · Salesforce → LLM

Chat & Helpdesk Bots

Slack · Teams · Discord · Salesforce Agentforce

3 min

Deploy a ready-made bot. One-click deploy buttons or “Add to Slack” OAuth.

@Plynf what's the status of order #12345?

REST / Webhook

Custom Python / Node agents · Bedrock Lambda

10 min

POST tool calls. Get shaped responses back.

curl -X POST app.plynf.com/v1/tools/get_order/invoke \
  -d '{"order_id":"12345"}'

Data minimization, not promises

The agent never sees the data it doesn't need.

That's not just a cost thing. It's a data-exposure thing. When you ship 200 Salesforce fields into an LLM call, you've effectively shared those fields with the model provider. Plynf lets you draw the line technically — which fields cross, which don't, which get masked, which get logged.

And it doesn't guess what matters. You set the rules — or start from a shipped default — and Plynf enforces them deterministically, plus a lossless pass that drops only null, empty, and metadata fields. Same answer the model would've given on the full payload, minus the wasted tokens.

Deterministic — no second model

Shaping is a pure transform, not another AI guessing what matters. Same input, same output, every decision in the audit log. No extra call, latency, tokens, or cost.

Field-level allow-lists you control

You whitelist what each tool may return (or start from a shipped default). Matching is casing- and synonym-robust — orderId, order_number, ORDER_ID all resolve.

Lossless auto-minimize

Null/empty fields and audit metadata are dropped automatically, zero config. It only removes data that carries no signal — so it can never change the model's answer.

Never blanks on a schema mismatch

If a keep-list can't find a field (a renamed schema), the response isn't emptied — it falls back to the safe, minimized body and flags the policy to fix.

PII masking and redaction

Sensitive fields can be hashed, masked, or removed before reaching the model.

Read-only mode per connector

Block write actions entirely. Useful for pilots and compliance reviews.

Tenant-isolated cache with TTL

Redis-backed, namespaced per tenant, never persisted to disk. TTLs bounded by policy.

Self-hosted or EU-hosted

Helm chart for your own infra; Plynf Cloud runs in Germany. You decide where your data is.

Plynf is a technical layer. It helps you implement data minimization, field-level access control, and audit logging — it does not replace a GDPR assessment, a DPIA, or your own legal review. DPA available on request.

The flow

How an agent flows through Plynf.

Four stages, one call. The runtime carries the state so your prompt stays focused on the next decision, not the last ten.

STAGE 01 Agent emits intent Your loop calls one SDK method. STAGE 02 Workspace receives state Versioned KV, files, snapshots. STAGE 03 Gateway routes tools OAuth, cache, audit, cost caps. STAGE 04 Tools execute Eight providers. Streaming results.

How it works

Three steps from clone to production.

Plynf is infrastructure, not a framework. It runs underneath whatever agent you already have. Anthropic, OpenAI, Mock, or local. Bring your own loop.

STEP 01

Install in 30 seconds

One command installs Plynf and starts the runtime in the background. Live dashboard at localhost:7424.

$ curl -fsSL https://plynf.com/install.sh | sh
STEP 02

Wire your agent

One SDK call. Pick Python, TypeScript, Go, Swift, or Kotlin. The agent gets a workspace, gateway, and channels.

$ client.workspace("research")
STEP 03

Ship

Multi-tenancy, OAuth, audit, cost tracking, k8s + Helm + Terraform ready out of the box. v1 API stable.

$ helm install plinth ./deploy/helm

Capabilities

Six primitives. One coherent runtime.

Each one removes a category of plumbing you'd otherwise have to build, deploy, and maintain yourself. They are designed together, not retrofitted.

Primitive 01

Persistent workspace

KV, files, snapshots, and branches. Versioned. Crash-safe. The agent's memory survives everything.

Keys stored

1,247

Snapshots

38

Branches

6

Tool gateway

Single boundary for every external tool. Caching, audit, OAuth, cost-caps. All built-in.

Multi-agent channels

Durable typed message queues. Multi-agent pipelines without prompt-history sprawl.

Primitive 04

Resumable workflows

Worker pool with lease-based recovery. Crash mid-flight, pick up where you left off. Verified by a runnable demo.

Production safety

JWT, multi-tenant, GDPR, rate limits, tamper-evident audit, published threat model.

8 OAuth providers

GitHub, Slack, Linear, Notion, Google Workspace, Atlassian, Salesforce, Asana. Real flows.

Lifecycle

How a workspace evolves over time.

Every write is a version. Every snapshot is a checkpoint. Every branch is an experiment you can throw away or merge back without fear.

V1 · WRITE kv.set("topic", "renewables") V2 · WRITE files.write("notes/raw.md") V3 · SNAPSHOT tag: "baseline" V4 · BRANCH name: "experiment" V5 · MERGE strategy: "fast-forward" MAIN
  • Every write is versioned

    No silent overwrites. A monotonic version counter per workspace makes "what did we know at v17" trivially recoverable.

  • Snapshots are named checkpoints

    Take a labelled freeze before a risky tool call. Restore in one call when the model goes off the rails.

  • Branches are speculative

    Fork the workspace, let an agent try three approaches in parallel, throw away the failures, merge the winner.

  • Merges are explicit

    Fast-forward or three-way merge, your choice. Conflicts surface to the agent as structured data, not raw diffs.

SDKs

One coherent surface. Five languages.

The same primitives (workspace, gateway, channels, workflows) in the language your team already ships in. API-stable, no breaking changes through v1.

# Python
from plinth import Plynf

client = Plynf(
    workspace_url="http://localhost:7421",
    gateway_url="http://localhost:7422",
    api_key="local-dev",
)

ws = client.workspace("my-research")
ws.kv.set("topic", "renewable energy")

# Token-efficient: stores in workspace, doesn't bloat prompt history
sources = client.tools.invoke("web.search", {"query": "renewable energy"})
for src in sources["results"]:
    content = client.tools.invoke("web.fetch", {"url": src["url"]})  # cached
    ws.files.write(f"sources/{slug(src['url'])}.txt", content)

ws.snapshot("sources-collected")

Result: a 5-source research task uses 71% fewer tokens than the same task without Plynf. Measured across three topics, fully reproducible.

Token economics

23,704 tokens becomes 6,795.

Same task, same model, same five sources. The difference is whether the agent re-reads its own past notes on every step. Real workload, fully reproducible.

Without Plynf

23,704

tokens / task

Prompt re-reads history every step

−71%

tokens
removed

With Plynf

6,795

tokens / task

State lives in the workspace

Task

5-source research summary

Model

Claude · 10 reasoning steps

Reproducible

examples/token-bench in repo

💧

The side-effect nobody counts: tokens you never send are compute that never runs — and data-center cooling water that never evaporates. At fleet scale that's an estimated ~0.7 mL of water per 1,000 tokens saved. Your dashboard tallies the litres. (order-of-magnitude estimate)

Across workloads · 800 simulated runs

It's not just research. It's every kind of agent work.

We measured eight different workflows across eight personas — from a hobby researcher to a 14-file code review, from a 10-turn support agent to a quarterly market report. The shape is the same everywhere: chat-history goes quadratic, Plynf stays roughly linear. Token reduction averages 80.3% across 800 Monte-Carlo runs, typically 78.6 — 87.4% per workflow.

Headline · 800 runs

80.3%

mean token reduction

Across 8 workflows × 100 perturbed runs with realistic variance on page sizes, file counts, and conversation turns. The shape is the same everywhere:

Typical case: 78.6 — 87.4% per workflow (IQR). Stays above 76% for everything except RAG (where even good baselines compress aggressively). Stable across seeds — runs reproduce within ±0.5pp.

30 academic PDFs

From $91.68 → $9.39 on one report.

97.6% fewer tokens
$91.68 $9.39 per run · Sonnet 4.5

Analyst hands the agent 30 papers. Naive baseline carries 600k tokens of fetched text on every synthesis step. Plynf keeps them on the desk, carries handles in the prompt.

10-turn customer support

The bill stops doubling at turn 4.

86.3% fewer tokens
$1.15 $0.37 per run · Sonnet 4.5

Every prior message + every CRM lookup gets re-sent on every reply in the baseline. Plynf's per-turn prompt only carries the handles that turn actually needs.

14-file pull request

Same coverage. 84% cheaper.

83.8% fewer tokens
$1.30 $0.41 per run · Sonnet 4.5

Per-file analysis. The agent reviewing file 12 doesn't need to see findings for files 1–11 in its prompt — but the baseline insists. Plynf scopes each step.

12-section market report

Each section carries only what it cites.

88.9% fewer tokens
$5.16 $1.57 per run · Sonnet 4.5

13 sections, each drawing on different parts of a 6-source corpus. Naive chains drag every source + every prior section forward. Plynf's prompt grows with the decision, not the data.

All eight workflows · 100 runs each · seed-stable

Run yourself: python -m benchmarks.workflows.run_simulation

Workflow Mean
5-source research synthesis 84.4%
30-PDF literature review 97.4%
Researcher → Writer → Reviewer (3 rounds) 81.9%
Code review on 14-file PR 82.5%
10-turn customer support with lookups 83.5%
Sales lead enrichment + CRM sync 77.3%
Q&A across 50 contracts with citation 47.0%
12-section quarterly market report 88.7%
800 pooled runs 80.3%

800 Monte-Carlo runs

Each scenario perturbed 100 times — realistic variance on page sizes, file counts, conversation turns. The mean across all 800 is the headline.

Reproducible · seed=42

Md5-stable across processes, runs across Python invocations. Run with a different seed and you'll get within ±0.5pp of these numbers.

Cross-checked

Suite vs live LLM runs match within ±5 percentage points. The conservative 71% on the hero is from a real run; 80.3% is the upper-bound model.

Methodology: MODEL.md · Simulation results: SIMULATION_RESULTS.md · Raw JSON: /results

80 %

Token reduction

Mean across 8 workloads · 800 runs

2,867

Tests passing

Services + all SDKs

5

SDK languages

Py · TS · Go · Swift · Kotlin

8

OAuth providers

Real flows, real tokens

13

Services

Deployable units

Multi-agent

Three agents. Two channels. One report.

Pipelines without prompt-history sprawl. Each agent reads from one durable typed queue, writes to the next. Add a reviewer step without re-engineering the upstream.

research-out Source[] · typed draft-out Draft · typed Researcher fetches sources Writer composes draft Reviewer final report
# Researcher publishes
ch.send("research-out", sources)
# Writer subscribes
async for msg in ch.recv("research-out"):

Architecture

A single coherent surface, composed from independent services.

Each service runs as its own process. Replace, scale, or harden any one of them independently. No hidden coupling. No magic.

AGENT Your loop Python · TS · Go Swift · Kotlin PLYNF Workspace KV · Files · Snapshots · Branches :21 Tool Gateway Cache · Audit · OAuth · Cost-caps :22 Identity JWT · Tenants · RS256 · JWKS :25 GitHub OAUTH Slack OAUTH Linear OAUTH Notion OAUTH Google OAUTH Atlassian OAUTH Salesforce OAUTH Asana OAUTH SDK CALL MCP / REST

Agent side

SDK in 5 languages. One call, no glue code.

Plynf runtime

Workspace + Gateway + Identity. All replaceable.

Tools side

8 OAuth providers built-in. MCP for the rest.

Connect

Works with everything your team already uses.

Point a base URL at Plynf, paste one config, or click Install — across every major AI SDK, agent IDE and automation tool. No rewrite. Most people are one copy away.

OpenAI · Python OpenAI · Node Anthropic · Python Anthropic · TS Google Gemini Mistral Cohere Azure OpenAI Vercel AI SDK LangChain LlamaIndex Pydantic AI CrewAI AutoGen Haystack LiteLLM Cursor Claude Code Cline Aider Windsurf Zed Open WebUI LibreChat n8n Zapier Make Copilot Studio Pipedream Ollama clients

Pricing

Free to start. Pro for teams. Real numbers for enterprise.

Apache 2.0 forever. Self-hosted is and will always be free. We gate on volume and features — never on how you connect. Every integration type (proxy, MCP, SDK, no-code node, webhook) works on every tier, including Free.

Cloud is in beta — Pro and Enterprise are confirmed-only today. Self-hosted available now. See roadmap →

Free

For solo builders and OSS projects.

$0 / forever
Get started
  • Shaped tokens / mo 100k
  • Connectors 3
  • Integration types All (proxy · MCP · SDK · node · webhook)
  • Savings dashboard Yes
  • PII redaction
  • Audit log
  • Custom REST connectors
  • SSO (SAML / OIDC) + self-hosted
  • Support Community
  • SLA None

Pro

For teams shipping production agents.

$49 / per month
Subscribe
  • Shaped tokens / mo 5M
  • Connectors All 8
  • Integration types All
  • Savings dashboard Yes + Postgres sink
  • PII redaction Yes
  • Audit log 90-day retention
  • Custom REST connectors Yes
  • SSO (SAML / OIDC) + self-hosted
  • Support Email (24h)
  • SLA 99.5%

Enterprise

For regulated industries and bigco.

Talk to us / annual contract
Contact sales
  • Shaped tokens / mo Unlimited
  • Connectors All 8 + custom REST
  • Integration types All + self-hosted Helm
  • Savings dashboard Yes + Postgres sink
  • PII redaction Yes
  • Audit log 7-year retention
  • Custom REST connectors Yes
  • SSO (SAML / OIDC) + self-hosted Yes
  • Support Dedicated Slack
  • SLA 99.95%

Need something custom? Just ask. All tiers run on identical core code. Apache 2.0, no proprietary forks.

FAQ

Honest answers to the questions buyers actually ask.

Still have one? Email us or open a discussion.

  • Why not just use LangChain?
    Plynf is infrastructure under your agent, not a framework. LangChain composes prompts. Plynf manages the runtime: workspace state, tool gateway, identity, coordination. Use both if you want.
  • Why not Temporal?
    Temporal is excellent at durable execution. Plynf includes that plus workspace state, tool gateway, identity, and 8 OAuth providers. Agent-aware. Packaged as one coherent surface, rather than five tools you have to stitch together.
  • Self-hosted or cloud?
    Self-hosted today. One command from a clean clone. Hosted SaaS in beta soon. The self-hosted build is and will always be Apache 2.0.
  • Which LLM does it use?
    Bring your own. Anthropic, OpenAI, local models, or our Mock provider for tests. Plynf is the substrate; the model is your choice.
  • What about data privacy?
    Self-hosted means your data never leaves your machine. Full stop. Cloud (when live) will be SOC 2 in progress, with a DPA on the Enterprise tier.
  • Is it production-ready?
    v1.5 ships with 2,867 tests, multi-region scaffolding, a Postgres backend, k8s/Helm/Terraform deploy artifacts, and a published threat model. First production deploys are this quarter.
  • What's the license?
    Apache 2.0. Use it, fork it, embed it. The only thing we ask is keep the upstream attribution.
  • How do I get help?
    GitHub issues for OSS. Email response within 24h on Pro. Dedicated Slack channel on Enterprise. We answer every issue, every time.

Ready when you are

Build the agent.
We'll handle the substrate.

Subscribe, paste your key into your agent, done — nothing to install. Or self-host with one command. Either way: production-ready when you are.

Prefer self-hosting?

$ curl -fsSL https://plynf.com/install.sh | sh