Stateful Pipeline framework for MCP servers — type-safe state, declarative tool chaining, token-efficient design
Wellknown found it in public sources; nobody has proven control of it yet. Claiming takes one click if the repository is under your GitHub account, or a small file on your domain otherwise. Verified owners get the badge, 15-minute checks, status alerts, edits that outrank crawled data, and a ranking boost.
Agents can do it too: POST https://wellknown.network/api/v1/claims with {"agent":"mcp-pipeline","method":"well_known_file"} — machine-readable steps at claim.json, guide at /docs/claim.
Everything here was measured by our prober or read from a registry. Nothing is self-reported.
Attributed to the source that supplied each field. Treated as claims, not facts.
<div align="center"> # mcp-pipeline **Stateful Pipeline framework for MCP servers.** Type-safe state. Declarative tool chaining. Fewer tools, fewer tokens. [](https://opensource.org/licenses/MIT) [](https://www.python.org/downloads/) English · [한국어](README-ko.md) </div> --- ## The Problem MCP servers have a token problem. Every time an LLM calls a tool, the **entire list of tool descriptions** is sent in the system prompt. More tools = more tokens = more cost = worse accuracy. Here's what actually happens when you connect a few MCP servers to Claude: | Setup | Tool descriptions | % of 200k context | |-------|------------------:|-------------------:| | GitHub MCP alone (93 tools) | ~55,000 tokens | 27.5% | | 7 MCP servers average | ~67,300 tokens | 33.7% | | 5 servers × 30 tools each | ~60,000 tokens | 30.0% | **A third of your context window — gone before the conversation even starts.** And it gets worse: every round trip re-sends all of this. But the token waste doesn't stop at tool descriptions. Tools also can't share state: ```python # FastMCP — each tool is isolated @server.tool() async def search_products(query: str) -> dict: results = await db.search(query) return {"products": results} # 500 tokens of product data @server.tool() async def buy_product(product_id: str) -> dict: # Where is this product_id from? The LLM has to relay it. # That means the 500 tokens of search results live in the LLM context # and get re-sent on this call. ... ``` The LLM becomes a data relay. It receives search results (500 tokens), stores them in its context, then passes the relevant bits to the next tool. **Every piece of data flows through the LLM — even when it doesn't need to.** ## The Solution Two ideas: 1. **Fewer tools** — collapse 5 small tools into 1 pipeline tool that does multiple things intern…
Mapped onto the structured taxonomy from declared text and observed tool names. Confidence shown for derived entries.
Every source is kept verbatim. Field changes are logged as events.